Pythonでの一連のデータ処理の中で「はじめのこのプロセスは単一のGPUで、だけどその後のこの処理は複数のGPUを使って高速に済ませたい」ということがあります。今回は複数のGPUが搭載されているマシンでGPUに並列処理をさせる話です。Windows10環境のPythonの場合です。
状況としては、単一のマシンに搭載されている2つのGPUがあり、そのうちの一方を使って処理を行うコマンド「hogehoge.exe」と、他方を使って処理を行うコマンド「fugafuga.exe」があるとします。その際に前者と後者を同時に実行し、かつ、それらが処理完了するまで後続の処理を待機させるには下記のようにします。
import subprocess # 各プロセスから返り値を得るのにloopを回すので、リストにする用意 procs = [] command_1 = 'hogehoge.exe' proc_1 = subprocess.Popen(["powershell.exe", command_1]) procs.append(proc_1) command_2 = 'fugafuga.exe' proc_2 = subprocess.Popen(["powershell.exe", command_2]) procs.append(proc_2) for proc in procs: # 上記のproc_1およびproc_2の出力(返り値)を受け取る proc.communicate() # proc_1とproc_2の返り値である標準出力が帰ってくるまで以降の処理に進まず待機する proc_1.wait() proc_2.wait()
ちなみに、Windows10でコマンドラインで起動させるアプリケーションを子プロセスとしてsubprocessでコールするには「powershell.exe」に対してコマンドを発行します。また子プロセスとしてコールするには「subprocess.Popen」を使います。
subprocess.Popenではなく「subprocess.call」を使った場合、proc_1が完了するまでproc_2の開始が待機するので間違えないように注意が必要です。
処理を並列化するには、互いの処理に依存関係がないことが必須条件です。なお、今回はGPU並列との観点で記載しましたが、マルチコアマルチスレッドのCPUについてもスレッドごとに処理を分ける場合も考え方は同じです。