2011-05-16 77 views
5

我剛剛閱讀這個相當有趣的文章,Copying Accelerated Video Decode Frame Buffers流媒體加載和非USWC內存

他們在哪裏解釋如何使用流式加載儘可能快地從USWC內存中進行復制。

我的問題是爲什麼這種技術不會加速正常的副本,從非USWC內存?

流式加載將一次讀取整個緩存行,而不是一次只讀取16個字節的常規加載。我錯過了什麼?並且從填充緩衝區複製到將被寫入緩存的「緩衝區緩衝區」不會有太多開銷,可以嗎?

+0

對於暗示性標題+1(蒸煮負荷最好是傾倒原料) – sehe 2011-05-16 07:41:34

+0

您最後一段的描述完全倒退。流加載/存儲意味着完全**繞過緩存,而常規加載/存儲('MOVDQA')是在緩存的幫助下執行的。另外請記住,單個高速緩存行通常比每個體系結構上的SIMD寄存器長度更寬。 – rwong 2015-03-23 16:06:24

回答

6

http://software.intel.com/en-us/articles/increasing-memory-throughput-with-intel-streaming-simd-extensions-4-intel-sse4-streaming-load/

「流式傳輸加載指令的目的是從USWC存儲器類型加速的數據傳輸。對於其它類型的存儲器,如高速緩存(WB)或不可緩存(UC),該指令的行爲作爲一個典型的16 -byte MOVDQA加載指令,但未來的處理器可能會使用其他內存類型(例如WB)的流加載指令作爲暗示,預期的緩存行應從內存直接流式傳輸到內核,同時將緩存污染降到最低。

也就是說,「正常」內存是WB,因此使用非時間加載/存儲與正常存儲沒有優勢。同樣,對於普通的可緩存內存,高速緩存行的第一次加載將把整個高速緩存行拉入到L1中,類似於第一個非時間加載將整個高速緩存行拉入特殊「非時間緩衝區」的方式。

正如上面的引用所述,未來的處理器可能會使用非暫時性的加載/存儲作爲暗示來不污染緩存。在某些情況下,這可能是一個好主意,但可能不是通用memcpy()實現的正確選擇?

+0

正確的,'memcpy'輸出經常被使用,所以你可能會得到一個更快的'memcpy',但是代碼會在所有緩存未命中後放慢。 (請參閱http://svn.0x00ff00ff.com/mirror/package/avisynth/x86/FilterSDK/IsMovntqFaster.htm) – 2015-04-30 21:31:55