質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

903閲覧

pythonのmultiprocessingを用いた内積計算速度の計測

anli_fumine

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/02/04 10:00

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2020/02/04 10:57

「全く処理が終わりません」とのことですが、どれくらいの時間で終るのを見込んでいて、どれくらい待ったのでしょうか。見込みの時間の計算は 1つ分計算するのに必要な時間を計測 × 総数 ÷ CPU数 × (オーバーヘッド分 1.5 とか 2 とか) こんな感じですかね。
anli_fumine

2020/02/04 11:43

要素数1000×1000の内積計算で pythonのnumpyの場合 0.06[sec] c言語での直列計算の場合 8.07[sec] でしたので、遅くても1分以内の処理時間を見込んでいました。 しかし、30分以上経っても計測時間が表示されませんでした。 実行しているGoogle colab環境でのスレッド数は2つでした。 よろしくお願いいたします。
hoshi-takanori

2020/02/10 07:31

ちょっと試してみたところ、 shared_arrayC[i * size + j] += shared_arrayA[i * size + k]*sheard_arrayB[k * size + j] のところでデッドロックしているように見えますね。理由はよく分かりませんが。 そもそも、functionの最初と最後にshared_countをacquireおよびreleaseしてるので、functionは並行して走らない(multiprocessingを使う意味がない)気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問