[问题] Cache size量测小程式数据解释

楼主: hsnuer1171 (阿赌)   2019-08-09 12:29:26
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
STL only
问题(Question):
Stackoverflow 详细内容:
https://stackoverflow.com/questions/57343855/program-to-measure-cache-size-please-explain-results/57344177#57344177
我写了一个简单的程式来量测Cache Line Size
就是每次跳一个step (offset)去存取array, 透过加大offset来观察执行时间
预计当offset超过cache line size时
会导致每次都要从下层(L2)抓一条新的cache line
Code:
void access_array(char* arr, int steps)
{
const int loop_cnt = 1024 * 1024 * 32; // arbitary loop count
int idx = 0;
for (int i = 0; i < loop_cnt; i++)
{
arr[idx] += 10;
idx = (idx + steps) & (ARRAY_SIZE - 1);
}
}
Result:
step , time(us)
1 , 29929
2 , 30003
4 , 30410
8 , 30046
16 , 31987
32 , 36796
64 , 72008
128 , 72300
256 , 71439
512 , 71460
1024 , 126504
2048 , 156086
4096 , 212619
8192 , 188025
16384 , 155549
32768 , 46295
在64的时候执行时间增加两倍, 因为我的cache line size = 64, 符合预期
我的问题是:
为什么从64到512时间几乎都没有改变, 而从1K开始到4K又递增上去?
Array size是256KB, 我试过128KB / 64 / 32 都是一样结果
Stackoverflow上面的回应是觉得跟prefetch / TLB miss有关,
我觉得解释听起来还算合理但是好像没有办法証明
我试着查过不少资料, 大多数是讲理论没有讲到太详细spec
所以想请各位帮忙解惑...
感谢
CPU: Intel Xeon(R) CPU E5-2667 0 @ 2.90GHz
Cache size:
LEVEL1_ICACHE_SIZE 32768
LEVEL1_ICACHE_ASSOC 8
LEVEL1_ICACHE_LINESIZE 64
LEVEL1_DCACHE_SIZE 32768
LEVEL1_DCACHE_ASSOC 8
LEVEL1_DCACHE_LINESIZE 64
LEVEL2_CACHE_SIZE 262144
LEVEL2_CACHE_ASSOC 8
LEVEL2_CACHE_LINESIZE 64
LEVEL3_CACHE_SIZE 15728640
LEVEL3_CACHE_ASSOC 20
LEVEL3_CACHE_LINESIZE 64
LEVEL4_CACHE_SIZE 0
LEVEL4_CACHE_ASSOC 0
LEVEL4_CACHE_LINESIZE 0
作者: wa120 (哇120)   2019-08-09 23:58:00
32768bytes/1024刚好32KB,for loop的loop_cnt用const,他会自动unrolling排vector register,因为vector register用满了,所以在固定倍数上产生两倍的load/storeregister说错 不好意思 用的是general register排满
作者: eye5002003 (下一夜)   2019-08-10 14:57:00
从32768开始,花费的时间反而变少了,确实值得研究
作者: johnjohnlin (嗯?)   2019-08-10 21:45:00
Benchmarking GPUs to Tune Dense Linear Algebra↑这篇论文有说明,主要原因是 cache assocgoogle 可以找这篇有公开

Links booklink

Contact Us: admin [ a t ] ucptt.com