AVX512CD содержит встроенный _mm512_conflict_epi32(__m512i a), он возвращает вектор, в котором для каждого элемента в устанавливается бит, если он имеет одинаковое значение. Есть ли способ сделать что-то подобное в AVX2?
Меня не интересуют точные биты, мне просто нужно знать, какие элементы являются дубликатами элементов слева от них. (или правильно). Мне просто нужно знать, будет ли скаттер конфликтовать.
По сути, мне нужен эквивалент 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() их вместе, что ужасно медленно.
Подробнее здесь:
https://stackoverflow.com/questions/448 ... on-in-avx2