MSVC++でコンパイルすると、バージョン1がバージョン2より速いのはなぜですか?キャッシュフレンドリーなループよりも速く2d-arrayでキャッシュされないループをキャッシュします
バージョン1:
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
for (int k = 0; k < N; ++k)
res1[i][j] += mat1[i][k] * mat2[k][j];
バージョン2:
(N = 1000; RES1、MAT1、MAT2ダブル[N]である[N]アレイ)
[j] [k]がキャッシュフレンドリである(mat2 [j] [k]をRAMからcacheにロードするときにmat2 [j] [k]にループするため、 +1]、mat2 [j] [k + 2]、...も同じcachline上にあるのでロードされます))?
(「#pragma optimize( ""、off)」を使用してコンパイラの最適化をオフにした場合)、バージョン2はバージョン1より高速ですが、コードはかなり遅く(明らかに)実行されます。
EDIT:
パフォーマンス:(時間WINDOWS.H ==> QueryPerformanceCounterの使用して測定)コンパイラの最適化で
を:バージョン1:〜493ミリ。 Version2:954 ms コンパイラ最適化なし:Version1:〜3868 ms;バージョン2:〜の最適化を使用して2266ミリ秒
有効になっている最適化の実際の数値は何ですか? – 2501
アセンブリを見ましたか? 'res1'、' mat1'、 'mat2'はどのような型ですか? – kfsone