作者hsnuer1171 (humanforestQQ)
看板C_and_CPP
标题[问题] Cache size量测小程式数据解释
时间Fri Aug 9 12:29:26 2019
开发平台(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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.229.42.20 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1565324968.A.C35.html
1F:推 wa120: 32768bytes/1024刚好32KB,for loop的loop_cnt用const,他会 08/09 23:58
2F:→ wa120: 自动unrolling排vector register,因为vector register用满 08/09 23:58
3F:→ wa120: 了,所以在固定倍数上产生两倍的load/store 08/09 23:58
4F:→ wa120: register说错 不好意思 用的是general register排满 08/10 00:07
5F:推 eye5002003: 从32768开始,花费的时间反而变少了,确实值得研究 08/10 14:57
6F:推 johnjohnlin: Benchmarking GPUs to Tune Dense Linear Algebra 08/10 21:45
7F:→ johnjohnlin: ↑这篇论文有说明,主要原因是 cache assoc 08/10 21:46
8F:→ johnjohnlin: google 可以找这篇有公开 08/10 21:46