私は次のような機能を持っています:
int doSomething(long numLoop,long arraySize){
int * buffer;
buffer = (int*) malloc (arraySize * sizeof(int));
long k;
int i;
for (i=0;i<arraySize;i++)
buffer[i]=2;//write to make sure memory is allocated
//start reading from cache
for(k=0;k<numLoop;k++){
int i;
int temp
for (i=0;i<arraySize;i++)
temp = buffer[i];
}
}
配列を宣言し、最初から最後まで読み取ることです。目的は、キャッシュの効果を確認することです。私が期待しているのは、doSomething(10000,1000)を呼び出すと、arraySizeが小さいため、すべてキャッシュに格納されるということです。その後、doSomething(100,100000)を呼び出すと、arraySizeがキャッシュのサイズよりも大きくなります。その結果、2番目の関数呼び出しは1番目の関数呼び出しよりも時間がかかるはずです。後者の関数呼び出しは、配列全体をキャッシュに格納できないため、一部のメモリアクセスに関係します。ただし、2回目の操作は1回目の操作とほぼ同じ時間がかかるようです。では、ここで何が問題になっていますか?-O0でコンパイルしようとしましたが、問題は解決しません。ありがとうございました。
更新1:これらはランダムアクセスのコードであり、機能しているようです。大きな配列での時間アクセスは約15秒、小さな配列での時間アクセスは約3秒です。
int doSomething(long numLoop,int a, long arraySize){
int * buffer;
buffer = (int*) malloc (arraySize * sizeof(int));
long k;
int i;
for (i=0;i<arraySize;i++)
buffer[i]=2;//write to make sure memory is allocated
//start reading from cache
for(k=0;k<numLoop;k++){
int temp;
for (i=0;i<arraySize;i++){
long randnum = rand();//max is 32767
randnum = (randnum <<16) | rand();
if (randnum < 0) randnum = -randnum;
randnum%=arraySize;
temp = buffer[randnum];
}
}
}