Самый быстрый способ определить положение SIMD по сравнению регистра - PullRequest
0 голосов
/ 24 мая 2018

У меня уже есть SIMD сравниваемый регистр __m128i, что приводит к чему-то вроде:

0, 0, -1, -1, 0, 0, 0, 0 // in shorts
0, -1, 0, 0 // in ints

Какой самый быстрый / самый дешевый способ получить позицию int, в которой установлены биты?Внутри __m128i есть только один тип int, установленный на 1.

Пример:

-1, -1, 0, 0, 0, 0, 0, 0  ->  0
0, 0, -1, -1, 0, 0, 0, 0  ->  1
0, 0, 0, 0, -1, -1, 0, 0  ->  2
0, 0, 0, 0, 0, 0, -1, -1  ->  3

Еще одно примечание, у меня есть только AVX и ниже, поэтому нет AVX2 или AVX-512.Я использую C ++ и Intel.


Редактировать: Это мой текущий код:

__m128i comparableLow = _mm_set_epi32(key - 1, key - 1, key - 1, key - 1);
__m128i comparableHigh = _mm_set_epi32(key + 1, key + 1, key + 1, key + 1);

__m128i mData = _mm_loadu_si128((__m128i*)(arr));
__m128i l1 = _mm_cmpgt_epi32(mData, comparableLow);
__m128i u1 = _mm_cmplt_epi32(mData, comparableHigh);
__m128i r1 = _mm_and_si128(u1, l1);
...