3

_mm512_storenrngo_pd_mm512_storenr_pd 有什么区别?

_mm512_storenr_pd(void * mt, __m512d v):

将压缩的双精度(64 位)浮点元素从 v 存储到内存地址 mt,并向处理器提供不读取提示。

我不清楚未读提示是什么意思。这是否意味着它是非缓存一致的写入。这是否意味着重用更昂贵或不连贯?

_mm512_storenrngo_pd(void * mt, __m512d v):

将压缩的双精度(64 位)浮点元素从 v 存储到内存地址 mt,并使用无读提示并使用弱排序内存一致性模型(使用此函数执行的存储不是全局排序的,后续存储从在他们之前可以观察到相同的线程)。

与 基本相同storenr_pd,但由于它使用弱一致性模型,这意味着进程可以在任何其他处理器之前查看自己的写入。但是另一个处理器的访问是不连贯的还是更昂贵?

4

1 回答 1

3

引用英特尔® 至强融核™ 协处理器矢量微架构

通常,为了写入高速缓存行,至强融核™ 协处理器需要先读取高速缓存行,然后再写入。这称为所有权读取 (RFO)。这种实现的一个问题是写入的数据没有被重用;我们不必要地占用 BW 来读取非时间数据。如果数据是流式存储,英特尔® 至强融核™ 协处理器支持不读入数据的指令。这些指令 VMOVNRAP*、VMOVNRNGOAP* 允许指示需要写入数据而无需先读取数据。在 Xeon Phi ISA 中,VMOVNRAPS/VMOVNRPD 指令能够在缓存未命中的情况下优化内存 BW,无需执行不必要的读取步骤。

当程序员容忍应用程序数据的弱写入顺序时,VMOVNRNGOAP* 指令很有用——也就是说,这些指令执行的存储不是全局排序的。这意味着在执行 VMOVNRNGOAP 指令之前可以观察到同一线程的后续写入。如果多个线程正在读取和写入同一位置,则应将此操作与内存隔离操作一起使用。

似乎“ No-read hints ”、“ Streaming store ”和“ Non-temporal Stream/Store ”在几个资源中可以互换使用。

所以是的,它是非缓存一致的写入,尽管使用 Knights Corner(KNC,vmovnrap* 和 vmovnrngoap* 都属于)存储发生在 L2 缓存中,它不会绕过所有级别的缓存。

正如上面的引用所解释的,vmovnrngoap*vmovnrap * 的特殊之处,弱排序内存一致性模型允许“在执行 VMOVNRNGOAP 指令之前可以观察到同一线程的后续写入”,所以是的,另一个线程或处理器的访问是非-连贯,并且应该使用围栏操作。虽然 CPUID 可以用作围栏操作,但更好的选项是“LOCK ADD [RSP],0”(虚拟原子添加)或 XCHG(结合了存储和围栏)。

更多细节:

NR 存储NR 存储指令 (vmovnr) 是标准向量存储指令,始终可以安全使用。本地缓存中未命中的 NR 存储指令导致远程缓存中缓存行的所有潜在副本无效,缓存行在本地缓存中以独占状态分配(但未初始化),并且写入数据在要写入高速缓存行的指令。没有从主存储器传输数据,这是节省内存带宽的原因。来自同一线程的 NR 存储指令和其他加载和/或存储指令是全局排序的,这意味着该指令序列的所有观察者始终看到相同的固定执行顺序。

NR.NGO _(non-globally ordered) store指令(vmovnrngo)放宽了NR store指令的全局排序约束。这种放宽使得NR.NGO指令的延迟比NRinstruction低,可以在流式存储密集型应用中实现更高的性能. 但是,取消此限制意味着来自同一线程的 NR.NGO 存储指令和其他加载和/或存储指令可以被两个观察者观察到具有两种不同的顺序。只有在验证重新排序这些指令的顺序不会改变结果时,使用 NR.NGO 存储指令才是安全的。否则,使用 NR.NGO 商店可能会导致错误执行。我们的编译器可以为它识别为具有非时间行为的存储指令生成 NR.NGO 存储指令。例如,被我们的编译器检测为非临时的并行循环可以使用 NR.NGO 指令。在这样的循环结束时,为了确保所有未完成的非全局有序存储都完成并且所有线程具有一致的内存视图,我们的编译器在循环之后生成一个栅栏(锁定指令)。在继续执行后续代码片段之前需要此栅栏,以确保所有线程具有完全相同的内存视图。

一般的经验法则是,非临时存储有利于在不久的将来不重用的内存访问块。因此,在这两种情况下,重复使用都是昂贵的。

于 2017-08-16T22:31:42.450 回答