web-dev-qa-db-ja.com

Numpyの2倍の速さのMATLAB

私は工学系の大学院生で、現在、数値シミュレーションの目的で、MATLABからPython=)に移行しています。基本的な配列操作では、NumpyはMATLABと同じくらい高速であるという印象を受けました。 、私が書いた2つの異なるプログラムでは、MATLABがNumpyの2倍弱の速さであるように見えます。Numpy(Python 3.3)に使用しているテストコードは次のとおりです。

import numpy as np
import time

a = np.random.Rand(5000,5000,3)

tic = time.time()
a[:,:,0] = a[:,:,1]
a[:,:,2] = a[:,:,0]
a[:,:,1] = a[:,:,2]
toc = time.time() - tic
print(toc)

一方、MATLAB 2012aで​​は次を使用しています。

a = Rand(5000,5000,3);

tic;
a(:,:,1) = a(:,:,2);
a(:,:,3) = a(:,:,1);
a(:,:,2) = a(:,:,3);
toc

私が使用しているアルゴリズムは、NASAで使用されているものです website NumpyとMATLABを比較しています。このウェブサイトは、Numpyがこのアルゴリズムの速度の点でMATLABを上回っていることを示しています。それでも私の結果は、Numpyの場合は0.49秒のシミュレーション時間、MATLABの場合は0.29秒のシミュレーション時間を示しています。また、NumpyとMatlabの両方でGauss-Seidelソルバーを実行したところ、同様の結果が得られました(16.5秒vs 9.5秒)

私はPythonに慣れていないので、プログラミングの観点からはあまり知識がありません。WinPython64ビットを使用していますPythonディストリビューションですが、Pythonxyも試しました役に立つ。

パフォーマンスを向上させるために読んだ1つのことは、MKLを使用してNumpyをビルドすることです。残念ながら、私はWindowsでこれを行う方法を知りません。これも行う必要がありますか?

助言がありますか?

21
nicholls

その比較は、キャッシングのためにリンゴからオレンジになってしまいます。これは、メモリの連続したチャンクを転送または処理する方が効率的だからです。実際には計算が行われないため、この特定のベンチマークはメモリバウンドです。したがって、良好なパフォーマンスを実現するには、キャッシュヒットの割合が重要です。

Matlabは列優先順(Fortran順)でデータを配置するため、a(:,:,k)は連続したメモリのチャンクであり、コピーが高速です。

Numpyはデフォルトで行優先順(C順)であるため、_a[:,:,k]_では要素間に大きなジャンプがあり、メモリ転送が遅くなります。実際には、データレイアウトを選択できます。私のラップトップでは、a = np.asfortranarray(np.random.Rand(5000,5000,3))を使用して配列を作成すると、5倍の速度になります(1秒vs 0.19秒)。

MKLは高速なLAPACK実装であり、ここではそれを使用する関数を呼び出していないため、この結果はnumpy-MKLと単純なnumpyの両方で非常に似ているはずです(MKLは線形システムを解決してドット積を計算するときに間違いなく役立ちます...)。

ガウスザイデルソルバーで何が起こっているのか本当にわかりませんが、少し前に MATLABの半分の速度で実行されているNumpy というMKLについて少し質問の答えを書きました。 FFTとMatlabのJIT。

57
jorgeca

NASA実験を再現しようとしていますが、変数の多くを変更しています。例えば:

  • ハードウェアとオペレーティングシステムが異なる(www.nccs.nasa.gov/dali_front.html)
  • あなたのPythonバージョンが異なります(2.5.3対3.3)
  • MATLABのバージョンが異なります(2008と2012)

NASAの結果が正しいと仮定すると、結果の違いは、これらの変更された変数の1つ以上によるものです。私はあなたをお勧めします:

  • ビルド済みのSciPy binaries で再テストします。
  • このタイプの計算に関連して [〜#〜] matlab [〜#〜] に改善が加えられたかどうかを調査します。

また、 このリンク が役立つ場合もあります。

3
R Dub