2

私は次のような機能を持っています:

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];
            }
    }
}
4

3 に答える 3

2

アレイに順番にアクセスしています。

for (i=0;i<arraySize;i++)           
    temp = buffer[i];

したがって、アクセスしている部分は常にキャッシュにあります。これは、そのパターンを予測するのが簡単だからです。キャッシュ効果を確認するには、たとえば(疑似)ランダムインデックスを生成して、配列のフロンとバックの間をジャンプするなど、予測しにくい順序で配列にアクセスする必要があります。

于 2012-09-30T18:03:22.507 に答える
1

他の答えに加えて:あなたのコードは順番にメモリにアクセスします。キャッシュラインが32バイトであると仮定しましょう。つまり、8回のアクセスごとにキャッシュミスが発生する可能性があります。したがって、ランダムなインデックスを選択すると、前の値から少なくとも32バイト離れたものにする必要があります

于 2012-09-30T18:07:47.847 に答える
0

複数の呼び出しにわたる効果を測定するには、同じバッファーを使用する必要があります(最初にキャッシュをロードし、次にキャッシュを使用することを想定して)。あなたの場合、あなたはすべての呼び出しに新しいバッファを割り当てています。(さらに、割り当てを解放することはありません。)

于 2012-09-30T18:04:55.717 に答える