


本文主要介绍数据预取优化。实验环境是CentOS7 + LLVM。
1. 优化方法简述
LLVM编译器支持自动数据预取和手动添加预取内建指令两种预取方式,其中自动数据预取是编译器对程序分析后在中间代码中自动插入预取指令,当前LLVM编译器仅支持AArch64平台和PowerPC平台的自动数据预取优化。手动添加的预取函数为:
该内建函数会在对应的汇编代码中生成预取指令以达到预取优化功能。
参数解释:
(1)addr:预取的内存地址
(2)rw:可选参数,0代表预取读操作,1代表预取写操作。
(3)locality:取值必须为常数,范围在0-3之间,0代表无时间局部性,1代表有低局部性,2代表有中等局部性,3代表有高局部性。即数值越大,时间局部性越高。
2. 示例分析
示例是一个简单的数组赋值以及结果打印的程序。优化前的代码命名为:prefetch-before.c.优化后的代码命名为:prefetch-after.c. 优化后的代码就是加入了预取函数。具体程序如下所示。
可以通过如下命令来分析数据预取优化前后程序的执行时间。
(1)clang prefetch-before.c -o prefetch-before
(2)./prefetch-before
(3)clang prefetch-after.c -o prefetch-after
(4)./prefetch-after
可以看出,数据预取优化前后,得到的计算结果都是一样的,但是经过数据预取优化后,程序的执行时间明显要比优化前的执行时间短,达到了优化的效果。
之后通过如下命令,可以查看数据预取优化前后程序生成的中间代码。
(5)clang prefetch-before.c -S -emit-llvm -o prefetch-before.ll
(6)clang prefetch-after.c -S -emit-llvm -o prefetch-after.ll
可以看出,在开启数据预取优化后,会在汇编代码中生成一个预取指令,从而达到程序性能优化的目的。
3. 总结
LLVM编译器支持自动数据预取和手动添加预取内建指令两种预取方式,其中自动数据预取是编译器对程序分析后在中间代码中自动插入预取指令,当前LLVM编译器仅支持AArch64平台和PowerPC平台的自动数据预取优化。手动添加的预取函数为:_builtin_prefetch(addr, rw, locality).
4. 参考资料
(1)自编教材分享:第八章—访存优化(三) - 哔哩哔哩 (bilibili.com)
(2)__builtin_prefetch_prefetch头文件-CSDN博客


