GCC、GDC、LLVM 和 LDC 编译器的预取内置函数 - 局部性参数的确切含义

问题描述 投票:0回答:1

在x86预取指令的描述中,我找到了以下指令提示编号的解释

“从内存中获取包含源操作数指定的字节的数据行,并将其存储到由位置提示指定的缓存层次结构中的位置:

T0(临时数据)——将数据预取到缓存层次结构的所有级别。 T1(与一级缓存未命中相关的时间数据)—将数据预取到二级缓存及更高级别。 T2(与二级缓存未命中相关的时间数据)—将数据预取到三级缓存及更高级别,或特定于实现的选择。 NTA(所有缓存级别的非临时数据)—将数据预取到非临时缓存结构和靠近处理器的位置,最大限度地减少缓存污染。”

我的问题:

  1. 对于 GCC 和 LLVM 用于访问预取指令的内置函数的“locality”参数,该描述是否也准确(除了调整 1 之外)?

  2. 我希望 GDC(GCC D 语言)和 LDC(LLVM D 语言)编译器在其预取函数中使用相同的局部性值。有谁能确认一下吗?

  3. GCC/GDC和LLVM/LDC编译器支持AArch64预取指令来控制数据缓存吗?

我希望记录一些调用与预取相关的编译器内置函数的包装函数,如果上面对 x86 指令的解释也适用于编译器内置函数的局部性参数,那么这是我见过的最清晰、最好的解释,所以我会在我自己的文档中引用它。

gcc llvm prefetch gdc ldc
1个回答
0
投票

我认为描述这一点的最佳方式是描述一个案例:T2。

假设您早餐想在一片吐司上涂一些黄油。你听过这个故事吗?不? CPU 中存有数据就像刀上涂了黄油,手上的刀准备将黄油涂在吐司上。 L1 缓存正在为您提供美味佳肴。 L2 缓存就像必须请某人递黄油,L3 缓存就像必须起身走到冰箱那儿,而主内存就像必须从商店再买一些黄油。

那么早餐前你会做什么呢?您预取黄油,这样您就不必在吃饭时从商店购买。

如果您认为您想要在吐司上涂黄油而不是果酱的可能性很小,您可以从商店预取到 L3 缓存(冰箱)。但是你是否预取到 L2(表)?如果你想预取到 L2,你必须驱逐一些东西(整理桌子并为黄油腾出空间)。有充分的理由不这样做。也许五个人会围坐在一张小阳台桌子周围,而你无法预取从冰箱到桌子的所有东西。

T2 说“我想我需要这些数据,所以将其预取到 L3,L3 很大,但机会并不接近 100%,所以不要从较小/较近的 L2 缓存中逐出任何内容”。

这段代码不太现实(变量名称太具有描述性):

if(a)
   b = c + d->e;

编译器会考虑分支被采用的可能性,并可能发出完美的指令。编译器将预取到哪个缓存级别?这取决于它判断

a
的可能性有多大。如果编译器认为
a
接近 100%,它可能会预取到 L2,如果稍微低于 L3。两个编译器不太可能选择相同的值,即使它们的实现代码相似。即使他们最终都为特定情况选择相同的值,决策过程也可能相似而不是相同。

© www.soinside.com 2019 - 2024. All rights reserved.