「全く処理が終わりません」とのことですが、どれくらいの時間で終るのを見込んでいて、どれくらい待ったのでしょうか。見込みの時間の計算は
1つ分計算するのに必要な時間を計測 × 総数 ÷ CPU数 × (オーバーヘッド分 1.5 とか 2 とか)
こんな感じですかね。
前提・実現したいこと
pythonのmultiprocessingを用いて内積計算をしたときの処理速度を計測したいのですが,実行しても全く処理が終わりません.
どなたかご教授のほどよろしくお願いいたします.
発生している問題・エラーメッセージ
make subprocess parent process: 770 process id: 4026 start subprocess parent process: 770 process id: 4026 parent process: 770 process id: 4026 parent process: 770 process id: 4026 parent process: 770 process id: 4026 parent process: 770 process id: 4026 parent process: 770 process id: 4026 Process ForkPoolWorker-64: Process ForkPoolWorker-63: Traceback (most recent call last): Traceback (most recent call last): File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3.6/multiprocessing/pool.py", line 108, in worker task = get() File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3.6/multiprocessing/pool.py", line 119, in worker result = (True, func(*args, **kwds)) File "/usr/lib/python3.6/multiprocessing/queues.py", line 335, in get res = self._reader.recv_bytes() --------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-111-d3639baca325> in <module>() 46 47 start = time.time() ---> 48 p.map(function, values) 49 elapsed_time = time.time() - start 50 4 frames /usr/lib/python3.6/threading.py in wait(self, timeout) 293 try: # restore state no matter what (e.g., KeyboardInterrupt) 294 if timeout is None: --> 295 waiter.acquire() 296 gotit = True 297 else: KeyboardInterrupt: File "/usr/lib/python3.6/multiprocessing/connection.py", line 216, in recv_bytes buf = self._recv_bytes(maxlength) File "/usr/lib/python3.6/multiprocessing/pool.py", line 44, in mapstar return list(map(*args)) File "<ipython-input-111-d3639baca325>", line 9, in function shared_count.acquire() File "/usr/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes buf = self._recv(4) KeyboardInterrupt File "/usr/lib/python3.6/multiprocessing/connection.py", line 379, in _recv chunk = read(handle, remaining) KeyboardInterrupt
該当のソースコード
import multiprocessing import os from multiprocessing import Pool, Value, Array import time size = 1000 def function(inputs): shared_count.acquire() print('parent process:', os.getppid()) print('process id:', os.getpid()) i,j = inputs for k in range(size): shared_arrayC[i * size + j] += shared_arrayA[i * size + k]*sheard_arrayB[k * size + j] time.sleep(2) shared_count.value += 1 print(shared_count.value) shared_count.release() def init(count,arrayA,arrayB,arrayC): global shared_count, shared_arrayA, shared_arrayB, shared_arrayC shared_count = count shared_arrayA = arrayA shared_arrayB = arrayB shared_arrayC = arrayC count = Value("d",0.0) A = [1 for j in range(size*size)] B = [1 for j in range(size*size)] C = [0 for j in range(size*size)] arrayA = Array('d',A) arrayB = Array('d',B) arrayC = Array('d',C) values = [(i, j) for i in range(size) for j in range(size)] print("make subprocess") p = Pool(processes=multiprocessing.cpu_count(),initializer=init, initargs=(count,arrayA,arrayB,arrayC)) print("start subprocess") start = time.time() p.map(function, values) elapsed_time = time.time() - start print("end subprocess") print("elapsed_time:{0}".format(elapsed_time) + "[sec]") p.close()
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
実行環境:Google Colab
要素数1000×1000の内積計算で
pythonのnumpyの場合 0.06[sec]
c言語での直列計算の場合 8.07[sec]
でしたので、遅くても1分以内の処理時間を見込んでいました。
しかし、30分以上経っても計測時間が表示されませんでした。
実行しているGoogle colab環境でのスレッド数は2つでした。
よろしくお願いいたします。
ちょっと試してみたところ、
shared_arrayC[i * size + j] += shared_arrayA[i * size + k]*sheard_arrayB[k * size + j]
のところでデッドロックしているように見えますね。理由はよく分かりませんが。
そもそも、functionの最初と最後にshared_countをacquireおよびreleaseしてるので、functionは並行して走らない(multiprocessingを使う意味がない)気がします。
あなたの回答
tips
プレビュー