_mm512_storenr_pd(void * mt,__m512d v):
存储从v到内存地址mt的双精度(64位)浮点元素,并向处理器发送未读提示。
我不清楚什么是不读的暗示。这是否意味着,它是一个非缓存的连贯写入。这是否意味着重用成本更高,或者不连贯?
_mm512_storenrngo_pd(void * mt,__m512d v):
使用弱有序内存一致性模型存储从v到内存地址mt的双精度(64位)浮点元素,并使用弱有序内存一致性模型(使用此函数执行的存储不是全局有序的,并且可以在它们之前观察到来自同一线程的后续存储)。
基本上与storenr_pd相同,但由于它使用弱一致性模型,这意味着进程可以在任何其他处理器之前查看自己的写操作。但是另一个处理器的访问是非相干的还是更昂贵的?
发布于 2017-08-16 22:31:42
引用Intel Xeon Phi™协处理器矢量微体系结构的话:
通常,为了写入缓存行,Xeon™协处理器在写入缓存行之前需要在缓存行中读取。这被称为(RFO)。这个实现的一个问题是书面数据不被重用;我们不必要地使用BW来读取非时态数据。Intel™协处理器支持在数据为流存储区时不读取数据的指令。这些指令,VMOVNRAP*,VMOVNRNGOAP*允许您指示需要写入数据,而不必先读取数据。在Xeon中,VMOVNRAPS/VMOVNRPD指令可以通过不执行不必要的读取步骤来优化内存BW。 当程序员容忍应用程序数据的弱写入排序时,VMOVNRNGOAP*指令非常有用,也就是说,这些指令执行的存储不是全局排序的。这意味着在执行VMOVNRNGOAP指令之前,可以观察到同一线程的后续写入。如果多个线程正在对同一位置进行读写,则应与此操作一起使用内存围栏操作。
似乎"No-read提示“、”流存储“和”非时态流/存储“在多个资源中交替使用。
是的,这是一种非缓存的连贯写入,尽管对于骑士角(KNC,vmovnrap*和vmovnrngoap*都属于)存储发生在L2缓存中,但它没有绕过所有级别的缓存。
如前所述, VMOVNRNGOAP *是vmovnrap*的特例,弱有序内存一致性模型允许“在执行VMOVNRNGOAP指令之前观察到同一线程的后续写入”,因此,对另一个线程或处理器的访问是非相干的,应该使用隔离操作。尽管CPUID可以用作围栏操作,但更好的选项是"LOCK ADD RSP,0“(一个虚拟原子添加)或XCHG (它将存储和栅栏组合在一起)。
还有几个细节:
NR存储.The NR存储指令(vmovnr)是一种可以安全使用的标准矢量存储指令。在本地缓存中丢失的NR存储指令将导致远程缓存中缓存行的所有潜在副本失效,缓存线在本地缓存中被分配(但不是初始化)处于独占状态,指令中的写数据将被写入缓存线。主存没有数据传输,这就节省了内存带宽。NR存储指令和来自同一线程的其他加载和/或存储指令是全局排序的,这意味着这个指令序列的所有观察者总是看到相同的固定执行顺序。 非全局有序( NR.NGO ,非全局有序)存储指令(Vmovnrngo)放松了NR存储instruction.This松弛的全局排序约束,使得NR.NGO指令具有比NRinstruction更低的延迟,可用于在流存储密集型应用中获得更高的性能。但是,删除此限制意味着两个观察者可以从同一个线程中观察到NR.NGO存储指令和其他加载和/或存储指令,以获得两个不同的顺序。只有在重新排序这些指令的顺序时,才能安全地使用NR.NGO存储指令,以避免更改结果。否则,使用NR.NGO存储可能导致不正确的执行。我们的编译器可以为它标识为具有非时态行为的存储指令生成NR.NGO存储指令。例如,被我们的编译器检测为非时态的并行循环可以使用NR.NGO指令。在这样一个循环的末尾,为了确保所有未完成的非全局有序存储被完成,并且所有线程都有一个一致的内存视图,我们的编译器在循环之后生成一个栅栏(一个锁指令)。在继续执行后续代码片段之前,需要使用这个栅栏,以确保所有线程都具有完全相同的内存视图。
一个普遍的经验法则是,非时态存储有利于内存访问块,这些访问块在不久的将来不会被重用。因此,在这两种情况下,重用都是昂贵的。
https://stackoverflow.com/questions/45715429
复制相似问题