Я играю, пишу с некоторыми функциями, оптимизированными для AVX. Я хочу использовать стандартный целочисленный тип аргумента без знака, такой как uint64_t
, вместо 256-битного целого числа без знака, требуемого инструкциями AVX (__m256i_u
). Можно ли сделать литье?
Какой на самом деле тип __m256i_u
? Судя по суффиксу _u
, это похоже на союз, так что вам лучше посмотреть, что внутри этого союза. А что говорит документация? Что говорят ваши учебники? Ваши учебники?
по крайней мере, в моих заголовках c он определяется как typedef long long __m256i_u __attribute__((__vector_size__(32), __aligned__(1)));
@Someprogrammerdude _u
в данном случае означает «невыровненный». gcc/clang использует указатель на этот тип в качестве аргумента для невыровненных загрузок/сохранений.
@Moldytzu Вам нужно предоставить более подробную информацию о том, чего вы пытаетесь достичь. Вы хотите поместить 64-битное целое число в самую нижнюю часть вашего __m256i
или вы хотите увеличить его в четыре раза? Пожалуйста, предоставьте минимальный воспроизводимый пример.
Я бы хотел заполнить переменную вот так ((__m256i_u)value << 192) | ((__m256i_u)value << 128) | ((__m256i_u)value << 64) | (__m256i_u)value
, чтобы она увеличила значение в четыре раза.
_mm256_set1_epi64x ? (по инструкции с удовольствием беру __m256i, не стоит смотреть на детали реализации с _u.
Или, если вы программируете специально для gcc и используете базовую операцию, vec+42
автоматически выполняет трансляцию за вас.
Нет, внутренний API Intel не допускает фактического приведения C между целочисленными и векторными типами, я думаю, даже между uint64_t
и __m64
(64-битный вектор MMX).
Используйте _mm256_set...
и _mm_cvtsi128_si64
. (И _mm256_castsi256_si128
, когда это необходимо), чтобы получить значение (я) в или низкое значение из вектора с широковещательной передачей или списком операндов. См. руководство Intel по встроенным функциям для cvt
и _mm256_set
встроенных функций; Google внутреннее имя для примеров его использования, особенно с site:stackoverflow.com
. Возможно, вы захотите ограничить поиск руководства по встроенным функциям SSE4, а не AVX2, чтобы ограничить количество встроенных функций, через которые нужно пройти. Итак, список параметров короче; сразу видно, что _mm_set_epi32()
принимает 4 int
аргумента, всего 128 бит.
См. также Каковы названия и значения встроенных типов векторных элементов, таких как epi64x или pi32? Re: существование epi64x
и epi64
(MMX в XMM против 64-битного целого числа)
Кроме того, используйте __m256i
, а не внутренний __m256i_u
невыровненный тип GCC. Используйте __m256i v = __mm256_loadu_si256((const __m256i*) ptr);
, чтобы выполнить невыровненную нагрузку.
Является ли один из этих типов частью стандарта языка C?