non*_*one 9 c c++ caching perf
我试图想出一个具有高缓存未命中率的示例程序.我想我可以尝试逐列访问矩阵,如下所示:
#include <stdlib.h>
int main(void)
{
int i, j, k;
int w = 1000;
int h = 1000;
int **block = malloc(w * sizeof(int*));
for (i = 0; i < w; i++) {
block[i] = malloc(h * sizeof(int));
}
for (k = 0; k < 10; k++) {
for (i = 0; i < w; i++) {
for (j = 0; j < h; j++) {
block[j][i] = 0;
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用-O0flag 编译它并使用perf stat -r 5 -B -e cache-references,cache-misses ./a.out它运行时给我:
Performance counter stats for './a.out' (5 runs):
715,463 cache-references ( +- 0.42% )
527,634 cache-misses # 73.747 % of all cache refs ( +- 2.53% )
0.112001160 seconds time elapsed ( +- 1.58% )
Run Code Online (Sandbox Code Playgroud)
这对我的目的来说足够好了.但是,如果我继续将矩阵大小更改为2000x2000它,则会给出:
Performance counter stats for './a.out' (5 runs):
6,364,995 cache-references ( +- 2.32% )
2,534,989 cache-misses # 39.827 % of all cache refs ( +- 0.02% )
0.461104903 seconds time elapsed ( +- 0.92% )
Run Code Online (Sandbox Code Playgroud)
如果我进一步增加它,3000x3000我得到:
Performance counter stats for './a.out' (5 runs):
59,204,028 cache-references ( +- 1.36% )
5,662,629 cache-misses # 9.565 % of all cache refs ( +- 0.11% )
1.116573625 seconds time elapsed ( +- 0.32% )
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为随着大小的增加,我希望得到更多的缓存未命中率.我需要一些尽可能与平台无关的东西.计算机体系结构课程很久以前就会受到欢迎.
笔记
我说我需要一些相对平台独立的东西,但这些仍然是我的规格:
注意现代CPU中的自动预取 - 它通常可以检测跨步访问.也许尝试随机访问模式,例如:
int main(void)
{
int i;
int n = 1000 * 1000;
int *block = malloc(n * sizeof(int));
for (i = 0; i < n / 10; i++) {
int ri = rand() % n;
block[ri] = 0;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)