14/05/17 21:42:09.88 HlllZZ0dQ
>>342
もちろんそうなんですが、SIMDで4つ同時に処理しているので、
「_mm_movemask_epi8が0だった」=「4つともアウト」なんですよ……
_mm_cmpeq_epi32を二周するのはアレっぽいので、次のように書き換えて比較ベンチしました。
MakeTrip_SSE2(Key_SSE2, Trip_SSE2);
for(uint64_t n = 0; n < PatternSize; ++n){
isMatch = true;
isMatch_SSE2 = Increment_SSE2[7];
for(uint k = 0; k < TripArraySize; ++k){
isMatch_SSE2 = _mm_and_si128(isMatch_SSE2, _mm_cmpeq_epi32(DecodedPattern_SSE2[n][k], _mm_and_si128(Trip_SSE2[k], PatternMask_SSE2[n][k])));
if(_mm_movemask_epi8(isMatch_SSE2) == 0x0){
isMatch = false;
break;
}
}
if(isMatch == true){
_mm_store_si128((__m128i*)isMatch_, isMatch_SSE2);
for(uint k = 0; k < SIMD_SSE2; ++k){
if(isMatch_[k] != 0){
Result[t] += PutTrip_SSE2(Key_SSE2, Trip_SSE2, k) + "\n";
}
}
}
}
結果、はっきりとした性能差は出ませんでした。まあ、ヒットすること前提の場合、こちらの方がいいのかもしれません。