Я смотрел на библиотеку 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?