そのため、同じ Python 仮想環境内の 2 つの異なるマシンに同じコードをデプロイしました。OS/カーネルはまったく同じで、ハード ドライブ モデルも同じです。2 つのマシンの唯一の大きな違いは CPU です。マシン 1 には 2 つの Xeon E5-2690 (16 コア @ 2.90 GHz) があり、マシン 2 には 1 つの Xeon W3690 (3.47 GHz で 6 コア) があります。
ここで、マルチプロセッシング プールを使用しないバージョンのコードを実行すると、マシン 1 がより高速に実行されます。ただし、マルチプロセッシング プールを使用すると、マシン 2 の実行速度が大幅に向上します (6 倍以上)。実際、マシン 1 は、作成するスレッドの数に関係なく、シングル スレッド バージョンよりもそれほど速くは実行されません。
問題のプロセスは、HDF5 ファイルを読み取り、データに対していくつかの基本的な数学演算を実行するだけです。
strace -c を実行するように提案されました。私の結果は、マシン 1 の futex にもう少し時間が費やされていることを示しています。
この問題は、マルチプロセッシングによって作成されるオーバーヘッドに関連していると確信していますが、それはかなり大きな違いです。また、0.57 GHz がこれほど大きな不一致を引き起こすとは信じがたいです。何か案は?
ありがとう!
編集:
したがって、IOを処理せずに実行したテストは次のとおりです。
マシン 1:
In [1]: import numpy as np
In [2]: import multiprocessing
In [3]: def gen_rand(x):
return np.random.random(x)
...:
In [4]: pool = multiprocessing.Pool(6)
In [5]: proc_arg = 100*[100000]
In [6]: %timeit -n30 pool.map(gen_rand, proc_arg)
30 loops, best of 3: 254 ms per loop
マシン 2:
In [1]: import numpy as np
In [2]: import multiprocessing
In [3]: def gen_rand(x):
return np.random.random(x)
...:
In [4]: pool = multiprocessing.Pool(6)
In [5]: proc_arg = 100*[100000]
In [6]: %timeit -n30 pool.map(gen_rand, proc_arg)
30 loops, best of 3: 133 ms per loop