【转载】思考题:缓存测试
2026-08-07 17:25:44
发布于:安徽
小明写了一段代码:
#include <iostream>
using namespace std;
using uint = unsigned int;
const int N=1<<8, M=1<<16, L=1<<4, B=0;
// 保证 L <= N
uint a[N][M+B];
void init(){
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
a[i][j]=i^j;
}
uint solve(){
uint ans=0;
for(int k=0;k<L;k++)
for(int j=0;j<M;j++)
for(int i=0;i<N;i++)
ans+=a[i][j]*a[i^k][j];
return ans;
}
int main(){
init(); // 初始化数据
cout<<solve()<<endl; // 测试运行时间
return 0;
}
问题0. 请你自行查询以下概念的介绍并尝试阅读:内存、硬盘、缓存、L1/L2/L3 缓存、缓存行、内存页、虚拟内存,并尝试查看自己的电脑的对应参数。善用 AI 辅助。
问题1. 请你测量这段代码在不同状况(例如 -O0 -O2)下 solve() 函数的运行时间。(如果你不知道测试这个函数运行时间应该使用怎样的工具/指令/代码/脚本,请自行查找试用并尝试总结。)
问题2. 将代码中的常数 B 修改为一些其它非负整数值(例如 B=1 B=4 B=1000 …… 和你想到的值),程序计算结果是否和原来相同?程序运行时间是否有显著变化?
问题3. 在你的电脑上分别测试 -O0 和 -O2 下,B=0 B=1 B=2 B=3 B=4 B=64 B=4096 的运行时间。将你的测试结果整理成表格和统计图。运行时间有什么规律?
问题4. 尝试修改 N, M, L 的值,测试在不同条件下 B 对运行时间的不同影响。
问题5. 请你在不减小加法、乘法、异或计算次数和内存访问次数的情况下(也就是你不能化简代码算式或直接输出答案等)优化这个代码的运行时间并测试。(用你理解的各种方式)
问题6. 请你尝试通过搜索、问 AI、同学研讨等方式学习以上现象的原理。
问题7. 一个流行的说法是“为了缓存友好不要开第二维长度是 2 的幂次的大数组,可以给第二维长度额外 +1”。请你辨析这个说法的原理和问题。
这里空空如也














有帮助,赞一个