Я впервые погружаюсь во встроенные функции SSE2 и не знаю, как это сделать.
Я хочу сравнить 4 int32 с 4 другими int32 и подсчитать, сколько из них равны. Итак, я прочитал свои первые 4 int32, установил их в __m128i, сделал то же самое для второго набора и использовал _mm_cmpeq_epi32 для сравнения.
Это должно привести к __m128i, содержащему 4 int32, каждый из которых либо 0xffffffff, либо 0, в зависимости от того, равны ли целые числа.
Но я понятия не имею, как из полученного __m128i получить количество, указывающее, сколько на самом деле было равно.
Может кто-то указать мне верное направление ?
Код, насколько я его собираю:
int* source = blah;
int* reference = otherblah;
// Load the 4 source int32's (they are actually 4 int32s apart)
__m128i first_4_int32s = _mm_set_epi32(*(source + 12), *(source + 8), *(source + 4), *(source));
// Load the 4 source int32's (also actually 4 int32s apart)
__m128i second_4_int32s = _mm_set_epi32(*(reference + 12), *(reference + 8), *(reference + 4), *(reference));
// Compare the int32's
__m128i result = _mm_cmpeq_epi32(first_4_int32s, second_4_int32s);
// Perform magic here that counts whether 0, 1, 2, 3 or all 4 ints were equal ?!?!
-1
. Итак, что вы можете сделать, так это вычесть значение сравнения из текущей суммы, используя _mm_sub_epi32. Таким образом, текущий минус 0 остается текущим. И текущий минус -1 становится текущим плюс 1 (вычитание отрицательного добавляет положительное). - person Apriori   schedule 11.07.2014