什么是_mm_prefetch()位置提示?

时间:2017-10-02 08:06:31

标签: c++ x86-64 intrinsics cpu-cache prefetch

intrinsics guide仅对void _mm_prefetch (char const* p, int i)

说了这么多
  

从包含地址p的内存中获取数据行到a   由locality提示i。

指定的缓存层次结构中的位置

您是否可以列出int i参数的可能值并解释其含义?

我找到了_MM_HINT_T0_MM_HINT_T1_MM_HINT_T2_MM_HINT_NTA_MM_HINT_ENTA,但我不知道这是否是一份详尽的清单,他们的意思。

如果特定于处理器,我想知道他们在Ryzen和最新的英特尔酷睿处理器上做了什么。

1 个答案:

答案 0 :(得分:17)

有时,内在函数在它们所代表的指令方面被更好地理解,而不是在它们的描述中给出的抽象语义。

如今的全部局部常数是

#define _MM_HINT_T0 1
#define _MM_HINT_T1 2
#define _MM_HINT_T2 3
#define _MM_HINT_NTA 0
#define _MM_HINT_ENTA 4
#define _MM_HINT_ET0 5
#define _MM_HINT_ET1 6
#define _MM_HINT_ET2 7

in this paper about Intel Xeon Phi coprocessor prefetching capabilities所述。

对于IA32 / AMD处理器,该集合减少为

#define _MM_HINT_T0 1
#define _MM_HINT_T1 2
#define _MM_HINT_T2 3
#define _MM_HINT_NTA 0
#define _MM_HINT_ET1 6

_mm_prefetch根据体系结构和位置提示编译成不同的指令

    Hint              IA32/AMD          iMC
_MM_HINT_T0           prefetcht0     vprefetch0
_MM_HINT_T1           prefetcht1     vprefetch1
_MM_HINT_T2           prefetcht2     vprefetch2
_MM_HINT_NTA          prefetchtnta   vprefetchnta
_MM_HINT_ENTA              -         vprefetchenta
_MM_HINT_ET0               -         vprefetchet0
_MM_HINT_ET1          prefetchtwt1   vprefetchet1
_MM_HINT_ET2               -         vprefetchet2

如果满足所有要求,(v)prefetch指令的作用是将高速缓存行的数据带入由地点提示指定的高速缓存级别。
该指令只是一个提示,可能会被忽略。

当一行被预取到X级时,手册(英特尔和AMD)都说它也进入了所有其他更高级别(但是对于X = 3的情况)。
我不确定这是否真的如此,我相信该行是预先缓存级别X并且取决于更高级别的缓存策略(包括与非包含)它也可能存在,也可能不存在。

(v)prefetch指令的另一个属性是非时间属性 非时态数据不太可能很快重复使用 根据我的理解,NT数据存储在IA32架构 1 的“流加载缓冲区”中,而对于iMC架构,它存储在普通缓存中(使用硬件线程ID的方式)但是使用最近使用替换策略(如果需要,它将成为下一个被驱逐的行) 对于AMD,手册中读取实际位置是依赖于实现的,从软件不可见缓冲区到专用非时态缓存。

(v)prefetch指令的最后一个属性是“intent”属性或“eviction”属性 由于MESI和变体协议,必须进行所有权请求以使线路进入独占状态(以便对其进行修改)。
RFO只是一个特殊的读取,所以用RFO预取它会直接进入Exclusive状态(否则它的第一个商店会因为需要“延迟”的RFO而取消预取的好处),我们知道我们会稍后再写。

由于非临时缓存级别是实现定义的方式,IA32和AMD体系结构不支持和排除非时间提示。 iMC架构允许使用位置代码_MM_HINT_ENTA

1 我理解为WC缓冲区。 Peter Cordes在comment below上澄清了这一点:如果预取USWC内存区域, prefetchnta仅使用Line-Fill缓冲区。否则它会预取到L1

此处参考是对所涉及指令的描述

  

PREFETCHh

     

从包含源操作数指定的字节的内存中获取数据行到   由locality提示指定的缓存层次结构:

     

•T0(时态数据) - 将数据预取到缓存层次结构的所有级别   •T1(关于第一级缓存未命中的时间数据) - 将数据预取到2级缓存和更高级别   •T2(关于二级缓存未命中的时间数据) - 将数据预取到级别3缓存和更高,或   特定于实施的选择   •NTA(关于所有缓存级别的非时间数据) - 将数据预取到非临时缓存结构中   进入靠近处理器的位置,最大限度地减少缓存污染。

     

PREFETCHWT1

     

从包含源操作数指定的字节的内存中获取数据行到   由写入提示的意图指定的缓存层次结构(以便通过请求将数据置于“独占”状态   所有权)和地方提示:

     

•T1(关于第一级缓存的时态数据) - 将数据预取到二级缓存中。

     

<强> VPREFETCHh

                Cache  Temporal    Exclusive state
                 Level
VPREFETCH0       L1     NO          NO
VPREFETCHNTA     L1     YES         NO
VPREFETCH1       L2     NO          NO
VPREFETCH2       L2     YES         NO
VPREFETCHE0      L1     NO          YES
VPREFETCHENTA    L1     YES         YES
VPREFETCHE1      L2     NO          YES
VPREFETCHE2      L2     YES         YES