Ищем индекс элемента в массиве через SIMD. Быстрый путь - PullRequest
0 голосов
/ 11 октября 2019

Мне нужно найти индекс / позицию 8-битного элемента значения N в массиве ARR через SIMD. Это должен быть быстрый способ.

На данный момент алгоритм заключается в том, что я бы загружал 8-битные значения ARR в один регистр SIMD и код символа N в другой регистр SIMD.

Затем я бы использовал отрицание и проверил, какой байт был успешным с popcnt.

Есть ли способ более быстрый ?

Операции могут быть насыщены, если необходимо.

1 Ответ

1 голос
/ 11 октября 2019

Какой набор инструкций / архитектура вы используете? Это несколько повлияет на «правильный» ответ на этот вопрос.

в SSE:

#include <immintrin.h>
#include <stdio.h>

int byteIndex(__m128i ARR, __m128i N)
{
  __m128i cmp = _mm_cmpeq_epi8(ARR, N);
  int mask = _mm_movemask_epi8(cmp);
  return _tzcnt_u32(mask);
}

int main()
{
  __m128i ARR = _mm_setr_epi8(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);

  // test case that will work
  __m128i N = _mm_set1_epi8(3);
  printf("%d\n", byteIndex(ARR, N));   ///< prints '3'

  // test case that will fail
  __m128i F = _mm_set1_epi8(16);
  printf("%d\n", byteIndex(ARR, F));   ///< prints '32'

  return 1;
}
...