3

そのため、同じ 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
4

0 に答える 0