Jetson NanoでPythonを使ってマルチコア並列処理を実装する

  • URLをコピーしました!

今回はJetson NanoのマルチコアCPUを使って、マルチプロセスで処理を並列実行する方法について解説します。ロボットなどのアプリケーションで活用してみてください。

また、Jetson Nanoに関する記事を以下のページでまとめていますので、あわせてご覧ください。

\ Pythonのプログラミングを学びたい人には自宅で学べるUdemyがおすすめ!  /

講座単位で購入できます!

目次

環境

ハードウェア:Jetson Nano A02 4GB
JETPACK SDK:4.6.2
Python:3.6.9

Jetson Nanoの本体については、私が使用しているモデルは旧モデルのA02ですが、これから購入される方はインタフェースなどが増えているB01モデルがおすすめです。

Pythonでの並列処理

Pythonで並列処理を実装する方法はいくつかあるのですが、私が今回使用する方法はコアごとにプロセスを割り当てて実行する方法です。プロセスを並列実行することをマルチプロセスと呼び、Pythonの標準ライブラリであるmultiprocessingを使用することで実現できます。

multiprocessingの使い方については、以前Raspberry Piで並列処理を実装した際に解説していますので、こちらをご覧ください。

作成したソースコード

今回はプロセス間のデータの受け渡しを共有メモリーを使った方法で実現します。共有メモリーの使い方については以下の記事で解説していますので、あわせてご覧ください。

ソースコードもこちらの記事で掲載しているRaspberry Pi用のものをそのまま使用します。

「ps_write」メソッドがプロセス①として実行され共有メモリーに書き込みを行う処理、「ps_read」メソッドがプロセス②として実行され、共有メモリーから読み出したデータをターミナルに出力する処理を実行します。

両プロセスが同じタイミングで共有メモリーにアクセスしてしまわないようにフラグで排他処理をしています。

import multiprocessing as mp
import ctypes
from ntpath import join
from time import sleep


#共有メモリ書き込み処理
def ps_write(*args):
    val = args[0] #データのアドレス
    flag = args[1] #フラグのアドレス
    sleep(2) #ログ確認のためのディレイ

    #書き込み開始
    flag.value = False
    val[0] = 10

    sleep(2) #ログ確認のためのディレイ

    #書き込み終了
    flag.value = True


#共有メモリ参照処理
def ps_read(*args):
    val = args[0]
    flag = args[1]

    while True:
        if not flag.value:  # データが変わるまで待つ
            print("prosess wait")
            sleep(0.1)
            continue
        
        #共有メモリからデータを初見出し
        data = val[0]

        print("process2 = ", data)


if __name__ == '__main__':
    #パラメータサイズ
    size = 1

    #プロセス間通信用の共有メモリーを生成
    arr = mp.Array(ctypes.c_int, [0]*size )
    flag = mp.Value(ctypes.c_bool, False)

    #パラメータ初期値
    arr[0] = 5 #初期値
    flag.value = True #読み出し可能状態

    #プロセスを生成
    p1 = mp.Process(target=ps_write, args=(arr, flag)) #プロセス①
    p2 = mp.Process(target=ps_read, args=(arr,flag)) #プロセス②

    #プロセス実行
    p1.start()
    p2.start()

    #プロセスを終了
    p1.join()
    p2.join()

実行結果

実行結果は以下のようになりました。

初期状態では共有メモリーの初期値「5」がプロセス②によって読みだされターミナルに出力されています。

途中、プロセス①が共有メモリーの値を書き換えている間は、プロセス②がwait状態となり、その後プロセス①によって書き換えられた「10」という値がプロセス②によって読み出されたことが確認できました。

まとめ

今回はJetson Nano上でPythonを使ってマルチコア並列処理を実装する方法を解説しました。multiprocessingはPythonの標準ライブラリですので、Raspberry Piのコードをそのまま動かすことができることが確認できました。

multiprocessingを使ってセンシングや機械学習の推論処理を同時実行することが可能です。Jetsonを使ったアプリケーションでぜひ活用してみてください。

\ Pythonのプログラミングを学びたい人には自宅で学べるUdemyがおすすめ!  /

講座単位で購入できます!

よかったらシェアしてね!
  • URLをコピーしました!
目次