Получить индекс первого элемента, который не равен нулю, в переменной __m256 - PullRequest
14 голосов
/ 31 марта 2019
__m256  dst = _mm256_cmp_ps(value1, value2, _CMP_LE_OQ);

Если dst равно [0,0,0,-nan, 0,0,0,-nan]; Я хочу иметь возможность узнать первый -nan индекс, в данном случае 3 без выполнения цикла for с 8 итерациями. Это возможно?

1 Ответ

8 голосов
/ 31 марта 2019

Я бы movmskps результат сравнения, а затем сделать битовое сканирование вперед .

Используя встроенные функции (это работает с gcc / clang, см. здесь для альтернатив ):

int pos = __builtin_ctz(_mm256_movemask_ps(dst));

Обратите внимание, что результат bsf не указан, если бит не установлен.Чтобы обойти это, вы можете, например, написать это, чтобы получить 8, если никакой другой бит не установлен:

int pos = __builtin_ctz(_mm256_movemask_ps(dst) | 0x100);
...