私は空間的局所性に関するキャッシュ操作を学習しています。 (私の参照は、これまでthis tutorial、林とスナイダーによって並列プログラミングの原則であり、もちろん、ウィキペディアの。)キャッシュの使用、空間的局所性、および待ち時間
は(インテルCore2のデュオCPUを使用して、Windows 7のProfessionalの上で実行されている、gccでコンパイルされ、以下の例を見てみましょうL7500)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *array;
int length;
int count;
int range;
int i;
// generate an array of a million integers between 0 and 99
length = 1000000;
range = 100;
array = calloc(length, sizeof(int));
srand(time(NULL));
for(i = 0; i < length; i++)
{
array[i] = rand() % range;
// printf("%d\n", array[i]);
}
// count the number of occurrences of 3 in the array
count=0;
for(i=0; i<length; i++)
{
if(array[i]==3)
{
count++;
}
}
printf("count = %6d\n", count);
return 0;
}
は今、日常の後半では、整数の配列全体は、CPUが事前にキャッシュにロードしなければならない空間的局所性につきので、読むことになるだろう。しかし、どのくらいの配列がループ中にいつでもキャッシュにロードできる/やらなければならないのか?一度に1つのキャッシュライン(intごとに64バイト/ 4バイト= 16の整数)、その大きなブロック、または1つのアレイ全体が急増しましたか? また、実際にルーチンを実行するのに必要な時間よりも、RAMからキャッシュに(またはローカル以外のものからテキストに)データを読み込む際のレイテンシは、はるかに重要です。本当ですか?
ここで、このコードをマルチプロセッサ/マルチコアマシンに移動し、コードのカウント部分を4,8,16などのパラレルスレッド(pthreadを使用)で実行するように変更し、配列の別々の部分を数えます最後にプライベートカウントを追加します。これによりRAMからキャッシュへのレイテンシが複数に分かれ、パラレルバージョンがシリアルより遅くなりますか?
ありがとうございます! (upvoteに十分な担当者がいません - ごめんなさい)。しかし、ループ中にいつでもキャッシュにロードすることができるかどうかについての洞察はありますか?一度に1つのキャッシュライン(64バイト/ 4バイト/整数= 16の整数)、その大きなブロック、または1つのアレイ全体が急増しましたか?それは私が実際に参照することができないものです。 –
@RevWaldo:ほとんどすべてのチップで変更されるため、おそらく参照が見つかりません。 Intel/AMDは常にキャッシュプリフェッチの動作を改善しようとしています。それを無視して、1つのキャッシュサイズのブロック内にメモリアクセスフットプリントを維持しようとするのがベストです。 –
なぜ、教科書の人たちは、パフォーマンスの結果を説明するときに「私たちは思う」と思っています。再度、感謝します。 –