利用运行时自适应解决缓存行窃取问题
1. 缓存行窃取数据量计算难题
计算被窃取的数据量并非易事。在基于硬件的预取机制中,供应商不一定会给出预取距离。而在软件环境下,如果能直接访问数组,计算则相对容易。
2. 实验设置
- 硬件环境 :采用Xeon(2.0 Ghz)Core 2系统,共有4个核心(2×2核心),由两个双核处理器共享2GB主内存。L1D缓存(32 KB)为每个核心私有,L2缓存(统一,同时存储指令和数据)由每组2个核心(相邻核心)共享,大小为4MB。Core 2核心是乱序、超标量处理器,支持SIMD指令(SSE)。两级缓存都内置了能够分析内存地址流并触发预取的硬件预取器(DPL),还具备“相邻缓存行预取”机制,会系统地预取正在获取的缓存行之后的那一行。
- 软件工具 :使用Intel的C编译器(icc v11.1)作为参考编译器。主要通过RDTSC指令精确计算已用周期数,同时使用Intel的性能调优工具(PTU)测量周期和指令计数。利用icc的OpenMP特性实现实验中的并行化。
- 实验方法 :每个内核先运行一次,将数据放入缓存层次结构,然后运行2000次并取平均值(针对周期计数),每次运行重复100次,选取最低的平均结果(以周期计),即保留最佳性能,以确保实验中因操作系统等因素产生的噪声最小。此外,重复循环还有一个有趣的副作用:如果数组足够小,能放入特定缓存级别(如L2),第一次迭代会将数组初始加载到L2缓存中,后续迭代则可直接在L2中找到它们。所有数组都按页边界对齐。由于数据能放入缓存且进行了足够