В чем разница между _mm512_load_epi32 и _mm512_load_si512? - PullRequest
0 голосов
/ 23 декабря 2018

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

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

и _mm512_load_si512:

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

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

1 Ответ

0 голосов
/ 23 декабря 2018

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

...