2017-08-16 81 views
3

_mm512_storenrngo_pd_mm512_storenr_pd有什么区别?_mm512_storenr_pd和_mm512_storenrngo_pd

_mm512_storenr_pd(无效*公吨,__m512d V):

商店压缩双精度(64位)从V 浮点元素存储器地址公吨用非读取暗示到处理器。

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

_mm512_storenrngo_pd(无效*公吨,__m512d V):

商店压缩双精度(64位)从V 浮点元素存储器地址公吨用无读提示,并使用微弱有序 内存一致性模型(使用此函数执行的存储不是全局排序的 ,并且来自同一个线程的后续存储可能是在它们之前观察到的 )。

storenr_pd基本相同,但由于它使用弱一致性模型,这意味着进程可以在任何其他处理器之前查看自己的写操作。但是另一个处理器的访问是非连贯的还是更昂贵的?从Intel® Xeon Phi™ Coprocessor Vector Microarchitecture

回答

3

报价:

一般情况下,为了写高速缓存行的至强融核™协处理器需要在写入之前在缓存行读取。这被称为读取所有权(RFO)。这种实现的一个问题是写入的数据没有被重用;我们不必要地占用BW来读取非时态数据。如果数据是流式存储,英特尔®至强融核™协处理器支持不读入数据的指令。这些指令VMOVNRAP *,VMOVNRNGOAP *允许指示数据需要先写入而不先读取数据。在至强披ISA的VMOVNRAPS/VMOVNRPD指令能够通过经由不必要读取步骤不打算来优化存储器BW在一个高速缓存未命中的情况下当程序员容忍的数据,也就是说,这些指令执行的店都没有全局排序的应用程序的弱写入顺序

的VMOVNRNGOAP *指令都很有用。这意味着在VMOVNRNGOAP指令执行之前,可以观察到相同线程的后续写入。一种存储器的防护操作应结合如果多个线程正在读取和写入到相同的位置来使用该操作。

看来,“无读提示”,“流式存储”和“非时效性的流/存储”互换在几个资源使用。

因此,它是非缓存一致的写入,尽管骑士角(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指令。在这样的循环结束时,为了确保所有未完成的非全局排序的存储都已完成,并且所有线程都具有一致的内存视图,我们的编译器在循环后生成一个fence(锁定指令)。在继续执行后续代码片段之前,需要使用此栅栏以确保所有线程具有完全相同的内存视图。

  • 一般的经验法则是,非临时存储区优势内存访问块不会在未来重用。所以在这两种情况下重复使用都会很昂贵。

    +0

    'vmovnrngoaps'停止重新排序以后的存储到“buffer_ready”标志后'sfence'是否不够?还是KNC不同?在“正常”的CPU上,['vmovntps [payload],ymm0' /'sfence' /'mov [flag],1'就足够了](https://stackoverflow.com/a/44866652/224132)。 (你确定'CPUID'甚至足够了吗?在存储器退役后,数据仍然可以存储在存储缓冲区中,并且CPUID序列化无序管道也不会刷新存储队列和NT存储缓冲区(例如Line-Fill Buffers),是吗?) –

    +0

    'vmovnrngoaps'听起来与AVX/AVX512'vmovntps' /'_mm512_stream_ps'完全相同。哦,KNC没有SFENCE或MFENCE吗?您的最后一个报价包括*我们的编译器生成围栏(锁定指令)*。我从未读过关于KNC的很多内容。 Agner Fog的微型指南甚至没有关于它的章节。 –

    +1

    我认为KNC不支持它们。按照英特尔®至强融核协处理器系统软件开发指南第4.2.18.1节的规定:“由于其更严格的内存排序模型,英特尔®至强融核协处理器不支持SFENCE,LFENCE和MFENCE指令,这些指令提供了更多有效的方式来控制其他英特尔处理器上的内存排序。“ – veritas