2013-03-22 47 views
1

關於非臨時寫和寫結合的技術,我已經將它寫在寫入組合:避免在寫入之前讀取哪條緩存行?

總結如下代碼

void setbytes(char *p, int c) 
{ 
__m128i i = _mm_set_epi8(c, c, c, c, 
c, c, c, c, 
c, c, c, c, 
c, c, c, c); 
_mm_stream_si128((__m128i *)&p[0], i); 
_mm_stream_si128((__m128i *)&p[16], i); 
_mm_stream_si128((__m128i *)&p[32], i); 
_mm_stream_si128((__m128i *)&p[48], i); 
} 

here

拍攝,該代碼序列不僅避免在讀取高速緩存 線被寫之前,它也避免了污染緩存,這可能不是可能很快就需要 數據。這在 某些情況下可以有很大的好處。

我的問題是:避免其高速緩存行寫?用於存儲i變量或p指針指向的緩存行的內容的緩存行(之後會被修改)?

回答

3

約:「避免在讀取高速緩存行之前,它被寫入」

這種說法是指「寫分配」政策,用於處理命中緩存寫入。所有現代的x86處理器都這樣做。它是這樣的:軟件使用正常的mov指令寫入內存。如果該地址已經被緩存,則緩存被更新並且根本沒有DRAM存取。但是,如果數據不在緩存中,則處理器從DRAM中讀取該緩存行。然後,來自mov指令的數據被合併到緩存中的數據中。處理器將盡可能延遲將數據寫回DRAM。最終結果是違反直覺的:軟件執行寫入(mov)指令,並且產生單個DRAM讀取(突發)。如果重複這種模式,緩存將最終變滿,並且需要逐出才能爲讀取留出空間。在這種情況下,將會有一個不相關的緩存行地址的DRAM寫入突發,然後讀取軟件正在寫入的地址。這解釋了爲什麼非暫時性商店給予大約2倍的填充大緩衝區的性能。與使用mov填充緩衝區相比,只有一半的DRAM訪問發生。

1

流防止緩存污染的,如果目的地的地址是不是已經在緩存中,否則,它只是更新並根據需要用書面通過緩存行支持的地址的新值緩存。

在你的榜樣

所以,如果你還沒有從p讀取(或你已經從CLFLUSH緩存中清除它),流媒體商店將防止數據被寫入到其中被加載到緩存中的地址p點通過p指出,(即:無cachline的將用於寫入地址來創建)。

+0

我得到的,但關於它說:「這個代碼序列,不僅可避免在讀取高速緩存線被寫之前」的部分是什麼?你向我解釋了這部分「它也避免了可能不需要的數據污染緩存」 – 2013-03-22 21:36:50

+0

@JohnnyPauling:'i'將被分配給一個寄存器,這意味着生成的代碼中沒有內存負載,因此它在使用時不會觸發並緩存爲其創建的行。 – Necrolis 2013-03-23 05:27:40

+0

你說得對,謝謝你向我解釋:D – 2013-03-23 10:02:15