Intel Data Dependent Prefetcher 对 SPEC CPU 2017 的影响
背景
最近在做一些商业硬件的 Data Dependent Prefetcher 测量,无意中注意到 Intel 13 代酷睿是有 Data Dependent Prefetcher 的,因此先进行了一个简单的尝试。
介绍与开关控制
介绍可以参考 Intel的文档 。
而根据 Intel 的文档,它的开关位于MSR IA32_SPEC_CTRL
的第8位,若要关闭,我们直接将该MSR读出来的结果 bitwise or 0x100即可,这里可以使用 msr-tools
软件包(Debian与Archlinux都可以直接使用该名称安装)进行控制。
开启DDP:
➜ ~ sudo rdmsr -x 0x48
1
➜ ~ sudo wrmsr 0x48 0x101 -a
➜ ~ sudo rdmsr -x 0x48
101
关闭DDP:
➜ ~ sudo wrmsr 0x48 0x1 -a
什么处理器开始支持?
根据 Intel 文档最后更新于于 2022 年 11 月,且只提到 "Some newer processors in the Intel® Core™ Processor Family" ,由于没有提到 Alder Lake 相同架构的 Xeon Sapphire Rapids ,我猜测是 Raptor Lake (也就是 13 代酷睿)开始支持。
于是找了台 i9 12900K 的机器测试,果然如此:
➜ ~ cat /proc/cpuinfo | grep model\ name | head -n 1
model name : 12th Gen Intel(R) Core(TM) i9-12900K
➜ ~ sudo rdmsr -x 0x48
1
➜ ~ sudo wrmsr 0x48 0x101 -a
wrmsr: CPU 0 cannot set MSR 0x00000048 to 0x0000000000000101
SPEC CPU简单测试
测试环境:
CPU: i9 13900K 关闭超线程、C State、小核
内存: 4xDDR5 4800MHz 32G JEDEC (共128G)
Kernel: Linux v6.5
编译器:gcc 13.2.0 (Debian gcc 13.2.0-4)
测试次数:3
SPEC运行命令:runcpu --iterations=3 --tuning=peak intspeed
SPEC配置文件:同Example-gcc-linux-x86.cfg,仅修改GCC路径。
默认状态:
600.perlbench_s NR 4 120 14.7 *
602.gcc_s NR 4 217 18.4 *
605.mcf_s NR 4 291 16.2 *
620.omnetpp_s NR 4 135 12.1 *
623.xalancbmk_s NR 4 117 12.1 *
625.x264_s NR 4 83.5 21.1 *
631.deepsjeng_s NR 4 174 8.21 *
641.leela_s NR 4 230 7.40 *
648.exchange2_s NR 4 100 29.3 *
657.xz_s NR 4 512 12.1 *
Est. SPECspeed(R)2017_int_base Not Run
Est. SPECspeed(R)2017_int_peak 14.0
关闭DDP:
600.perlbench_s NR 4 119 14.9 *
602.gcc_s NR 4 217 18.4 *
605.mcf_s NR 4 295 16.0 *
620.omnetpp_s NR 4 134 12.2 *
623.xalancbmk_s NR 4 118 12.0 *
625.x264_s NR 4 83.5 21.1 *
631.deepsjeng_s NR 4 174 8.21 *
641.leela_s NR 4 231 7.40 *
648.exchange2_s NR 4 100 29.3 *
657.xz_s NR 4 511 12.1 *
Est. SPECspeed(R)2017_int_base Not Run
Est. SPECspeed(R)2017_int_peak 14.0
可以看出,主要差距在于 mcf 与 perlbench ,其中 mcf 关闭 DDP 后性能略微降低, perlbench 关闭 DDP 后性能略微升高,这一点在我后续单独测试也可以验证,排除了实验误差的可能。
结论
Intel 13th Gen Core 上的 Data Dependent Prefetcher 在 SPEC CPU 2017 中的 mcf 与 perlbench 存在略微区别。但由于区别太小很难做更细致的 profiling ,或许需要寻找能打出更大区别的 workload ,也欢迎大家提供其他测试的建议。