在x86预取指令的描述中,我发现了以下对指令提示号的解释
“将包含源操作数指定的字节的数据行从内存中提取到该高速缓存层次结构中由位置提示指定的位置:
T0(临时数据)-将数据预取到该高速缓存层次结构的所有级别中。T1(与第一级缓存未命中相关的临时数据)-将数据预取到2级缓存和更高级别缓存中。T2(关于二级缓存未命中的临时数据)-将数据预取到三级缓存或更高级别缓存中,或特定于实现的选择。NTA(所有高速缓存级别的非临时数据)-将数据预取到非临时高速缓存结构中,并预取到靠近处理器的位置,最大限度地减少高速缓存污染。
我的问题:
1.对于GCC和LLVM访问预取指令的内置函数的“locality”参数,该描述是否也准确(除了调整1)?
1.我希望GDC(GCC D语言)和LDC(LLVM D语言)编译器在其预取函数中使用相同的局部性值。有人能证实吗?
- GCC/GDC和LLVM/LDC编译器是否支持AArch 64预取指令来控制数据缓存?
我希望记录一些调用编译器内建的与预取相关的 Package 器函数,如果上面对x86指令的解释也适用于编译器内建的局部参数,那么这是我见过的最清晰和最好的解释,所以我将在我自己的文档中引用。
1条答案
按热度按时间fhg3lkii1#
我认为最好的描述方式是描述一个案例:T2。
假设你想在一片吐司上涂一些黄油当早餐。你听过这个故事吗?不是吗?在CPU中存储数据就像你的刀上有黄油,而你手里拿着刀,准备把黄油涂在吐司上。L1缓存是把黄油放在盘子旁边。L2缓存就像是让别人把黄油递过来,L3缓存就像是站起来走到冰箱前,而主存就像是从商店里再拿一些黄油。
早餐前你会做什么?你预先准备好黄油,这样你就不必在吃饭的时候从商店里买了。
如果你认为有一个很小的机会,你会想在你的吐司,而不是果酱黄油,你从商店到L3缓存(冰箱)预取。但是你会预取到L2(表)吗?如果你想预取到L2,你必须驱逐一些东西(整理table,为黄油腾出空间)。我们有充分的理由不这样做。也许五个人会围坐在一张小阳台table旁,你不能把冰箱里的所有东西都提前拿到table上。
T2说:“我想我会需要这个数据,所以把它预取到L3中,L3很大,但是机会不会接近100%,所以不要从更小/更近的L2缓存中驱逐任何东西。
这段代码不是很现实(变量名描述性太强):
编译器将考虑采用分支的可能性,并可能发出预取指令。编译器将预取到哪个高速缓存级别?这取决于它判断
a
是什么的可能性。如果编译器认为a
接近100%,它可能会预取到L2,如果略低于L3。两个编译器不太可能选择相同的值,即使它们的实现代码相似。即使他们最终都为特定情况选择了相同的值,决策过程也可能相似而不是相同。