学校の課題として、構成ファイルを読み取ったり、API 呼び出しを使用したりせずに、L1 データ キャッシュ ラインのサイズを取得する方法を見つける必要があります。メモリアクセスの読み取り/書き込みタイミングを使用して、この情報を分析および取得することを想定しています。では、どうすればそれを行うことができますか?
割り当ての別の部分の不完全な試みで、キャッシュのレベルとサイズを見つけるために、私は持っています:
for (i = 0; i < steps; i++) {
arr[(i * 4) & lengthMod]++;
}
2行目を変更する必要があるのではないかと考えていました(i * 4)
か?キャッシュ ラインのサイズを超えたら、それを交換する必要があるかもしれませんが、それには時間がかかりますか? しかし、それはとても簡単ですか?必要なブロックが既にどこかのメモリにある可能性がありますか? steps
または、十分な大きさの があれば、それはまだかなり正確に機能するという事実に頼ることができますか?
アップデート
GitHubでのHeresの試み ...以下の主要部分
// repeatedly access/modify data, varying the STRIDE
for (int s = 4; s <= MAX_STRIDE/sizeof(int); s*=2) {
start = wall_clock_time();
for (unsigned int k = 0; k < REPS; k++) {
data[(k * s) & lengthMod]++;
}
end = wall_clock_time();
timeTaken = ((float)(end - start))/1000000000;
printf("%d, %1.2f \n", s * sizeof(int), timeTaken);
}
問題は、タイミングの間に大きな違いがないように見えることです。ご参考までに。L1キャッシュ用なので。私は SIZE = 32 K (配列のサイズ) を持っています