Нет никакой разницы, это просто глупое избыточное именование.Используйте _mm512_load_si512
для ясности. Спасибо, Intel.Как обычно, легче понять базовый ассемблер для 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
).