パフォーマンスのボトルネックがあります。私は大きな配列(250行& 130万列)の列方向平均を計算しています。私はそのアプリケーションで100万回以上を行います。高性能アレイの平均
Pythonで私のテストケース:
import numpy as np
big_array = np.random.random((250, 1300000))
%timeit mean = big_array.mean(axis = 0) # ~400 milliseconds
numpyのは、シングルコア上で実行されている、私のマシン上で約400ミリ秒かかります。私はさまざまな言語(Cython、R、Julia、Torch)でいくつかの他のマトリックスライブラリを試しましたが、JuliaだけがNumpyを打ち負かすのに約250ミリ秒かかっていました。
このタスクでは、パフォーマンスの大幅な向上の証拠は誰でも得ることができますか?おそらく、これはGPUに適したタスクですか?
編集:私のアプリケーションは明らかにメモリが制約されており、大規模な配列の要素に繰り返しアクセスするのではなく、1回だけアクセスすることでパフォーマンスが飛躍的に向上します。 (下のコメントを参照してください)
この計算は、おそらくCPUの作業よりもメモリアクセスに関するものです。ここではnumpyを大幅に改善するシステムはないと思います。私の直感は、複数のコアやGPUを使うのはあまり役に立たないということです。 float32に減らすことは役に立ちます。 – MRocklin
テストケースが単純すぎる可能性があります。私の配列型は実際にブール値になるので、すべての要素はNumpyのバイトとして格納されます。逆説的に、boolean配列の平均値や合計値は、例のように浮動小数点数に比べて長くなります。ビットパッキングされた配列の操作をどのように実行するか考えていますが、これはメモリトラフィックを90%削減しますか? –
私の特定のアプリケーションでは、22,000行の配列の250行のサブセットである配列の平均をとっています。メモリアクセスだけで、計算全体で合計24時間以上になります。しかし、私が大きな行列で操作し、各要素を1回だけタッチすると、メモリアクセスは合計で10秒未満になります。私はそれを試さなければならない!ボトルネックを指摘してくれてありがとう@MRocklin。 –