2011-12-08 29 views
1

我有以下類型的代碼SIMD店延遲

short v[8] __attribute__ ((aligned(16))); 
... 
// in an inlined function : 
_mm_store_si128(v, some_m128i_value); 
... // some more operation (4 additions) 
outp[0] = v[1]/2; // <- first access of v since the previous store 

當我詮釋這個代碼PERF,這一條線上的佔18%,整個取樣 !當我說行時,它是在彙編級別,即從v計數移動到18%後立即執行的指令。

它是否是緩存未命中?我如何測試?

我並不真的需要存儲結果,但是我怎樣才能避免往返內存,並且仍然單獨訪問構成我的m128i值的8條短文。

更新: 如果我使用_mm_extract_epi16,那麼整體性能不會更好,但是等待會在每次訪問之間平均分配,而不是隻打到第一個。

+0

你測試哪個CPU? –

+0

core2duo家族,32位操作系統 – shodanex

+0

您有存儲轉發問題。您可能會在英特爾優化手冊中看到詳細信息。總之,你可以嘗試去加載v的第一個雙字,並將它轉換成第二個單詞。 –

回答

6

而不是做一個SIMD存儲,然後是標量加載,您應該使用_mm_extract_epi16PEXTRW)直接從您的128位SSE寄存器獲得16位標量值,而無需通過內存(例如,

outp[0] = _mm_extract_epi16(some_m128i_value, 6); 
+3

當然,我在1小時前睡着了... +1。我想補充一點。您通常要避免立即以不同的字大小訪問相同的內存。大多數處理器加載/存儲單元未針對這些情況進行優化,最終將所有內容刷新到高速緩存並重新讀回 - 通常會導致10+週期處罰。 – Mysticial

+0

哇!這是一個非常有趣的評論!我真的不明白爲什麼V陣列會以某種方式被刷新。 – shodanex