数据变更时CPU缓存行为:两次循环的缓存重新加载次数探究
数据变更对CPU缓存的影响及代码分析
首先明确前提:假设CPU缓存行大小为64字节(主流CPU的常见配置),int类型占4字节,因此代码中的arr[16]刚好占用1个完整的缓存行;同时基于单线程执行场景,不存在其他CPU核心对该内存区域的干扰。
第一个循环的重新加载次数:0
for (int i = 1; i < 16; i++) { arr[i] = arr[i] + arr[i-1]; }
循环首次执行时,读取arr[0]和arr[1]会触发缓存不命中,CPU会将整个arr所在的64字节缓存行加载到L1缓存中。后续所有的arr[i]读取与写入操作都命中缓存:写入时缓存行已处于可修改状态,无需重新加载任何缓存数据。因此这个循环中,没有因写入操作导致的缓存重新加载。
第二个循环的重新加载次数:0
for (int i = 0; i < 16; i++) { arr[i] += arr[i]; }
第一个循环执行完毕后,arr的缓存行仍驻留在CPU缓存中(无被替换的触发条件)。此循环中所有的arr[i]读取和写入操作均命中缓存,写入时无需重新加载缓存数据,因此同样没有因写入操作导致的缓存重新加载。
内容的提问来源于stack exchange,提问作者scasci
相关产品推荐
相关产品推荐

