Generi c SIMD-код в LLVM-IR для поиска строки - PullRequest
2 голосов
/ 29 апреля 2020

Я смотрел на библиотеку simdcsv , чтобы попытаться понять основы того, что они делают, как они ускоряют поиск разделителей.

Это часть их функции cmp_mask_against_input:

#include "intrin.h"
#include <cstdint>

struct simd_input {
  __m256i lo;
  __m256i hi;
};

inline uint64_t cmp_mask_against_input(simd_input in, uint8_t m) {

      const __m256i mask = _mm256_set1_epi8(m);
      __m256i cmp_res_0 = _mm256_cmpeq_epi8(in.lo, mask);
      uint64_t res_0 = static_cast<uint32_t>(_mm256_movemask_epi8(cmp_res_0));
      __m256i cmp_res_1 = _mm256_cmpeq_epi8(in.hi, mask);
      uint64_t res_1 = _mm256_movemask_epi8(cmp_res_1);
      return res_0 | (res_1 << 32);

}

int main () {

}

Это работает на процессорах, которые поддерживают AVX2. Моя старая машина имеет только SSE2, и я предполагаю, что все между ними нуждается в своих #ifdef с разными командами и т. Д. c.

Мне было интересно - если я не возражаю, что мой код компилируется только на Clang - возможно ли создать «обобщенную c» версию для поиска строки, которую Clang преобразует в соответствующие команды cmpeq / move?

...