の2行を比較しようとしていますpixel
。
Aは、4つの値(RGBA)を含むpixel
ものとして定義されます。struct
float
私が使用していない理由memcmp
は、1番目の異なるピクセルの位置を返す必要があるためmemcmp
です。
私の最初の実装はSSE
組み込み関数を使用しており、以下よりも約30%遅くなりますmemcmp
。
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;
}
次に、値をfloatではなく整数として扱うと、処理速度が少し速くなり、現在は。よりもわずか20%遅くなっていることがわかりましたmemcmp
。
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;
}
他の質問で読んだことから、のMS実装memcmp
もを使用して実装されてSSE
います。私の質問は、MSの実装には、私が持っていない他のトリックがありますか?バイトごとの比較を行っても、それでもどのように高速ですか?
アラインメントは問題ですか?に4つの浮動小数点数が含まれている場合、pixel
ピクセルの配列はすでに16バイト境界に割り当てられていませんか?
/o2
とすべての最適化フラグをコンパイルしています。