我想比較兩行pixel
s。爲什麼這比memcmp慢
A pixel
被定義爲包含4個值(RGBA)的struct
。
我不使用memcmp
的原因是因爲我需要返回第一個不同像素的位置,而不是memcmp
。
我的第一個實現使用SSE
內部函數,並且是〜比memcmp
慢30%:
inline int PixelMemCmp(const Pixel* a, const Pixel* b, int count)
{
for (int i = 0; i < count; i++)
{
__m128 x = _mm_load_ps((float*)(a + i));
__m128 y = _mm_load_ps((float*)(b + i));
__m128 cmp = _mm_cmpeq_ps(x, y);
if (_mm_movemask_ps(cmp) != 15) return i;
}
return -1;
}
然後我發現,治療的價值觀爲整數,而不是浮點數加快了一點東西,只有現在〜比memcmp
慢20%。
inline int PixelMemCmp(const Pixel* a, const Pixel* b, int count)
{
for (int i = 0; i < count; i++)
{
__m128i x = _mm_load_si128((__m128i*)(a + i));
__m128i y = _mm_load_si128((__m128i*)(b + i));
__m128i cmp = _mm_cmpeq_epi32(x, y);
if (_mm_movemask_epi8(cmp) != 0xffff) return i;
}
return -1;
}
從我讀過關於其他問題的memcmp
的MS執行使用SSE
也可以實現。我的問題是MS實施有什麼其他的技巧,我不知道它的袖子?即使它進行逐字節比較,它又如何更快?
對齊是一個問題嗎?如果pixel
包含4個浮點數,那麼在16字節邊界上是否已經分配了一個像素數組?
我在編譯/o2
和所有的優化標誌。
不,不能保證它會在16個字節上對齊,除非您親自處理它。 – interjay 2013-02-10 10:14:08
是的,對齊是一個問題。您使用的編譯選項也是相關的。你也應該顯示生成的asm。也許編譯器缺少循環展開或代碼上的其他優化。 – 2013-02-10 10:18:59