2017-03-07 7 views
5

私は、次のMATLABコード走った:私のMacAir(インテル(R)Core(TM)i5-4260U CPUの@の1.40GHz)でラップトップと比べて7コアのワークステーションで行列乗算が遅くなるのはなぜですか?

rng(1) 
matrix_size = 200; 
iterations = 100000; 
A = rand(matrix_size); 
B = rand(matrix_size); 

profile on 
for i = 1:iterations 
    A * B; 
end 
profile off 

を、これは39Sをとります。 7つのコア(Intel(R)Xeon(R)CPU E5-2687W v4 @ 3.00GHz)を搭載したワークステーションでは、62秒かかる。

-singleCompThreadを指定しませんでした。ワークステーションには12のコアがありますが、5つのシングルスレッドプロセスが実行されていました。私は(ほとんど)7本のコアを持っていました。彼らは全期間にわたって最大にされました。

これはどのようにすることができますか?

-singleCompThreadで上記のコードを実行すると、54秒で完了します。 Mathworks社サポートチームpost引用

+0

このテストは、ランダムな行列ではなく特定の行列で実行する必要があります。ランダム性が要因になる可能性があります。 – Wolfie

+2

これらの行列は両方のマシンで同じですが、これは種を設定する 'rng(1)'のためです。 – Kappie001

+1

['timeit'](https://www.mathworks.com/help/matlab/ref/timeit.html)を使って同じテストを行うとどうなりますか? i = 1の場合、 'f = @():iterations;を試してください。 A * B;最後に '' t = timeit(f); 'となります。 – craigim

答えて

1

:MATLAB 7.4(R2007a)のよう

を、MATLABは 要素単位関数(例えば、Y =の組み合わせで機能や表現の数のマルチスレッド計算 をサポート4 * x *(sin(x)+ x^3))。これらの関数 は複数のスレッドで自動的に実行され、 のコードを明示的に指定してコード内にスレッドを作成する必要はありません。より速く実行する機能または発現のため

(高速)複数 コア上に、以下の条件が真でなければならない:

1)関数によって行わアルゴリズムの動作は 容易セクションに分割されています同時に実行することが可能であり、通信がほとんどないか、または逐次的な操作がほとんど必要なくなる。 これは、すべての要素ごとの操作の場合です。

2)データサイズが十分大きいため、同時実行の利点は、データを分割して別の実行スレッドを管理するのに必要な時間を上回ります。たとえば、配列が数千要素を超える場合、ほとんどの関数は の速度を上げます。

3)処理時間が がメモリアクセス時間を支配する場合、操作はメモリバインドではありません。単純操作の場合のように、要素ごとの追加などがあります。一般的な規則として、より複雑な 関数は、単純関数よりもスピードアップします。

あなたのケースでは、フルフィル2または3はありません。乗算は非常に高速でシンプルで、メモリに束縛されており、行列は比較的小さいです。 -singleCompThreadを使用したテストから見たように、マルチスレッドにはより多くのオーバーヘッドが含まれているように見えます。大きな行列でベンチマークを試して、その差が変わるかどうかを調べることができます。また、-singleCompThreadを使ってMacbookのベンチマークを試して、相対的なシングルスレッドのパフォーマンスが予想される範囲に収まっているかどうかを調べることもできます。

別の(部分的な)説明は、Sandy BridgeとHaswellとの間の異なるベクトル命令、すなわちAVX2とすることができる。私はそれを調べる前にまずベンチマークをしたいと思います。

また、MatlabプロファイラはJITをオフにします。だから、あなたが得た結果は、あなたがベンチマーキングしている実際のケースに匹敵しないかもしれません。

関連する問題