В чем разница между _mm512_load_epi32 и _mm512_load_si512?

Руководство Intel по внутренним характеристикам просто утверждает, что _mm512_load_epi32:

Загрузить [s] 512-бит (состоит из 16 упакованных 32-битных целых) из памяти в dst

и это _mm512_load_si512:

Загрузка [s] 512-бит целочисленных данных из памяти в DST

В чем разница между этими двумя? Документация не ясна.

1 ответ

Решение

Там нет разницы, это просто глупо избыточное именование. использование _mm512_load_si512 для ясности. Спасибо, Интел. Как обычно, легче понять базовый ассемблер для AVX512, а затем вы можете увидеть, что пытается сказать неуклюжая внутренняя система имен. Или, по крайней мере, вы можете понять, как мы закончили с этим беспорядком различной документации, предлагающей _mm512_load_epi32 против _mm512_load_si512,

Почти все инструкции AVX512 поддерживают маскирование слиянием и нулевое маскирование. (например vmovdqa32 может сделать замаскированную нагрузку как vmovdqa32 zmm0{k1}{z}, [rdi] обнулить векторные элементы, где k1 был нулевой бит), поэтому существуют разные версии элементов, такие как векторные нагрузки и побитовые операции. (например vpxord против vpxorq).

Но эти свойства предназначены для версии без маскировки. Размер элемента совершенно не имеет значения. я догадываюсь _mm512_load_epi32 существует для согласованности с _mm512_mask_load_epi32 (маскирование слиянием) и _mm512_maskz_load_epi32 (Нуль-маскирование). Смотрите документы для vmovdqa32 инструкция asm.

например _mm512_maskz_loadu_epi64(0x55, x) обнуляет нечетные элементы бесплатно при загрузке. (По крайней мере, это бесплатно, если стоимость сдачи 0x55 в k регистр можно вывести из цикла. И если мы не воспользовались возможностью компилятора сложить загрузку в операнд памяти для инструкции ALU.)

Когда все элементы загружаются в место назначения без изменений, границы элементов не имеют смысла. Вот почему AVX2 и более ранние версии не имеют разных версий побитовых логических значений размера элемента, таких как _mm_xor_si128 и загружает / хранит как _mm_load_si128,


Некоторые компиляторы не поддерживают имена ширины элемента для невыровненных немаскированных нагрузок. Например, текущий GCC не поддерживает _mm512_loadu_epi64 хотя это поддерживается _mm512_load_epi64 начиная с первой версии gcc для поддержки встроенных функций AVX512. (См. Ошибку: "_mm512_loadu_epi64" не был объявлен в этой области)

Там нет процессоров, где выбор vmovdqa64 против vmovdqa32 для эффективности это вообще не имеет значения, поэтому нет смысла пытаться намекнуть компилятору использовать один или другой, независимо от естественной ширины элемента ваших данных.

Только FP против целого числа могут иметь значение для нагрузок, а встроенные функции Intel уже используют разные типы (__m512 против __m512i) для этого.

Другие вопросы по тегам