AVX512CD содержит встроенный _mm512_conflict_epi32(__m512i a)
, он возвращает вектор, где для каждого элемента в a
бит устанавливается, если он имеет то же значение. Есть ли способ сделать что-то подобное в AVX2?
Мне не интересны биты extact. Мне просто нужно знать, какие элементы являются дубликатами элементов слева (или справа). Мне просто нужно знать, будет ли конфликт рассеяния.
В принципе мне нужен эквивалент AVX2 для
__mm256i detect_conflict(__mm256i a) {
__mm256i cd = _mm256_conflict_epi32(a);
return _mm256_cmpgt_epi32(cd, _mm256_set1_epi32(0));
}
Единственный способ, которым я мог подумать, - это использовать _mm256_permutevar8x32_epi32()
сдвинуть каждое значение справа на 1 (по полосам), а не на семь сравнений, замаскировать нечетные биты и _mm256_or_si256()
их вместе, что очень медленно.