私は、forループの1つに小さな違いを持った2つのほぼ同じコードをテストしています。最初は3つのループを使用してインデックスy
,z
,x
を反復し、2番目のループはx
,z
,y
を繰り返します。実行時間の異なるほぼ同じコード - なぜですか?
私の質問は、なぜユーザーの時間と壁時計の時間の違いですか?あるコードと他のコードのメモリ位置のためですか?
test_1.c:
#define N 1000
// Matrix definition
long long int A[N][N],B[N][N],R[N][N];
int main()
{
int x,y,z;
char str[100];
/*Matrix initialization*/
for(y=0;y<N;y++)
for(x=0;x<N;x++)
{
A[y][x]=x;
B[y][x]=y;
R[y][x]=0;
}
/*Matrix multiplication*/
for(y=0;y<N;y++)
for(z=0;z<N;z++)
for(x=0;x<N;x++)
{
R[y][x]+= A[y][z] * B[z][x];
}
exit(0);
}
第コード(test_2.c)そのループの最後での差:
for(x=0;x<N;x++)
for(z=0;z<N;z++)
for(y=0;y<N;y++)
{
R[y][x]+= A[y][z] * B[z][x];
}
Iは/ユーザー/ binに/時間を印刷する場合 - -v ./test_2は、以下の統計情報を提供し、ユーザー/ binに/時間/ながら
Command being timed: "./test_1"
User time (seconds): 5.19
System time (seconds): 0.01
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.22
:V ./test_1私は、次の統計情報を取得する
Command being timed: "./test_2"
User time (seconds): 7.75
System time (seconds): 0.00
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:07.76
これはおそらく、他の方法よりも1つの方法でキャッシュミスが増えるためです。 Googleの "キャッシュデータの地域性"。 –
['cachegrind'](http://valgrind.org/docs/manual/cg-manual.html)のようなキャッシュプロファイリングツールでコードを実行してみてください。 –