どのバージョンがより効率的で、なぜそうですか? 両方とも同じ計算をするようです。コンパイラが(a)j
で値を変更せず、何度も何度も計算する必要がないことをコンパイラが認識した場合のみ、私が考えることができます。 すべての入力は素晴らしいでしょう!どちらが良いメモリアクセスですか? (C++)
#define M /* some mildly large number */
double a[M*M], x[M], c[M];
int i, j;
(a) First version
for (j = 0; j < M; j++)
for (i = 0; i < M; i++)
c[j] += a[i+j*M]*x[i];
(b) Second version
for (i = 0; i < M; i++)
for (j = 0; j < M; j++)
c[j] += a[i+j*M]*x[i];
対象のコンピュータで測定して調べます。 –
@PaulR:本物の質問 - 現代のコンパイラはこれを見つけず、ループプリアンブルを入れ替えることができますか?セマンティクスが同じであることを見ることは同じです。 –
@LightnessRacesinOrbit:はい、いくつかのコンパイラは、少なくともこのような単純なケースではループの並べ替えを行うことができます。 –