Дублирование типа данных __m256i

Меня интересует копирование данных типа __m256i (используется в Intel Intrinsics для инструкций AVX) в новый __m256i.

Я знаю, что могу сохранить данные из регистра AVX в памяти, а затем из памяти, я могу загрузить данные в новый регистр. Однако есть ли более простой способ (т.е. специальная инструкция для этого), где я могу напрямую «клонировать» регистр, не используя сначала операции для его сохранения в памяти, а затем снова загружая его?

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

Извините, если это простой вопрос (это простая проблема). Мне просто не удалось найти ни одной встроенной функции, которая могла бы сделать это за меня.


person oPolo    schedule 23.04.2016    source источник


Ответы (2)


Вы можете просто выполнить присваивание обычным способом, например

__m256i v1 = _mm256_set1_epi32(42);
__m256i v2 = v1;

Компилятор обычно генерирует инструкцию vmovdqa (или может даже просто оптимизировать регистровую копию).

person Paul R    schedule 23.04.2016
comment
Ах, как здорово. Трудно найти эту полезную информацию на целевой странице Intel Intrinsics, но это действительно упрощает задачу! Я думал, что это будет обрабатываться как ссылки, поэтому тогда они указывали на один и тот же элемент данных! - person oPolo; 23.04.2016
comment
Да, сейчас это, вероятно, кажется ослепляюще очевидным, но вы можете просто обращаться с __m256i как с любым другим простым типом, например. int, что касается многих основных операций. Так же, как int может быть выделено компилятором скалярному регистру общего назначения, __m256i может быть выделено регистру ymm. - person Paul R; 23.04.2016

Вы можете легко скопировать регистр YMM в сборке x86 в другой, используя MOVDQA.

vmovdqa ymm0, ymm1

Соответствующим внутренним элементом этого является

_mm256_store_si256(_m256i *p, __m256i a);

Компилятор должен оптимизировать любые ссылки на переменные.

person zx485    schedule 23.04.2016
comment
Большое спасибо. Я совершенно неправильно понял документацию Intel. Это помогает! - person oPolo; 23.04.2016
comment
Я бы не рекомендовал писать store встроенную функцию для копирования данных между локальными переменными, где вы не ожидаете фактического сохранения в памяти. Встроенные функции store / storeu в основном существуют для передачи компилятору гарантий выравнивания, иначе вы бы просто написали *p = a; - person Peter Cordes; 23.04.2016