2017-08-16 38 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