关于GCC/GDC、LLVM/LDC预取内建函数locality参数等技术问询
预取指令与编译器内建函数相关问题解答
x86预取指令局部性提示说明
将包含源操作数指定字节的内存行数据预取到由局部性提示指定的缓存层级位置:
T0(临时数据)——将数据预取到所有缓存层级。
T1(针对一级缓存未命中的临时数据)——将数据预取到二级及更高层级缓存。
T2(针对二级缓存未命中的临时数据)——将数据预取到三级及更高层级缓存,或由实现自行选择。
NTA(针对所有缓存层级的非临时数据)——将数据预取到非临时缓存结构及靠近处理器的位置,最大限度减少缓存污染。
问题1:上述描述(除数值需减1调整外)是否适用于GCC和LLVM预取指令内建函数的‘locality’参数?
- 适用。GCC和LLVM的x86预取内建函数(如
__builtin_prefetch)的locality参数映射逻辑与上述x86硬件指令提示完全匹配,仅需将硬件提示对应的逻辑层级数值减1:- 硬件T0 → 参数值0(预取到所有缓存层级)
- 硬件T1 → 参数值1(预取到二级及以上缓存)
- 硬件T2 → 参数值2(预取到三级及以上缓存,或由编译器/硬件实现决定)
- 硬件NTA → 参数值3(非临时预取,最小化缓存污染)
- 该映射仅适用于x86架构,其他架构不适用此规则。
问题2:GDC(GCC的D语言编译器)和LDC(LLVM的D语言编译器)的预取函数是否使用相同的locality参数值?
- 是的。x86架构下,GDC的
core.intrinsics.prefetch与LDC的core.bitop.prefetch(或对应底层内建函数)的locality参数取值逻辑完全对齐:- 参数0对应T0级局部性
- 参数1对应T1级局部性
- 参数2对应T2级局部性
- 参数3对应NTA非临时预取
- 非x86架构下需参考对应架构的编译器文档,但x86平台的参数值可通用。
问题3:GCC/GDC和LLVM/LDC编译器是否支持用于控制数据缓存的AArch64预取指令?
- 均支持。
- GCC/GDC:通过
__builtin_aarch64_prfm内建函数实现对AArch64 PRFM预取指令的支持,可指定不同预取类型(如PLDL1KEEP、PLDL2KEEP等)来控制缓存层级和数据保留策略。 - LLVM/LDC:提供兼容的AArch64预取内建函数,或直接支持GCC风格的
__builtin_aarch64_prfm接口,覆盖所有AArch64定义的预取提示。
- GCC/GDC:通过
- 注意:AArch64的预取提示逻辑与x86完全不同,不能直接套用x86的T0/T1/T2/NTA规则,需参考ARM官方架构手册。
内容的提问来源于stack exchange,提问作者Cecil Ward
相关产品推荐
相关产品推荐

