Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Проблема с оптимизацией AVX-512 кода (TASM)

@Synergyst Мыслитель (8608), открыт 4 недели назад
Дело было так: нечем мне было заняться, решил поизучать AVX-512 и попытаться усрать че-то на там на ассемблере, используя его. Я пытаюсь оптимизировать участок кода, который занимается обработкой больших массивов данных с использованием инструкций AVX-512. Цель - максимально использовать возможности векторных регистров и минимизировать количество циклов процессора.

Проблема заключается в следующем: я хочу использовать маскирование, чтобы обрабатывать только часть элементов в регистрах zmm0 и zmm1 в зависимости от определенного условия. Однако, инструкции AVX-512 с масками (например, vaddps) требуют маски в регистре k0-k7:
 vmovups zmm0, [rsi] ; float[16] <= zmm0
vmovups zmm1, [rsi+64]

; тут был некоторый код

vaddps zmm0, zmm0, zmm11
vmovups [rdi], zmm0

add rsi, 128 ; ptr => next[data]
add rdi, 64 ; ptr => next[data] ?to: write
В то же время, условие, по которому я хочу маскировать данные, получается в результате сравнения двух других регистров zmm.

Так вот, вопрос:
Можно ли как-то эффективно сгенерировать маску в регистре k на основе сравнения значений в регистрах zmm, чтобы затем использовать её для выборочной обработки данных с помощью AVX-512 инструкций? Или может быть, есть другой способ достичь желаемого результата с использованием AVX-512, не прибегая к маскам? Я помню что есть vpcmpd сравнивающий значения векторных регистров, и типо можно сделать как-то k1 = zmm0 > zmm1 + k2 = zmm0 < zmm2, но честно без понятия, насколько это может быть эффективно.
Дополнен 4 недели назад
Проблему решили на StackOverflow.
Про vpcmpd я был прав. Так же предложили варианты конверсии при помощи VPMOVB2M/VPMOVW2M/VPMOVD2M/VPMOVQ2M.
2 ответа
Инспектор Жопидý Просветленный (28569) 4 недели назад
Решение проблемы с маскированием AVX-512
Да, можно эффективно сгенерировать маску в регистре k на основе сравнения значений в регистрах zmm и использовать её для выборочной обработки данных с помощью инструкций AVX-512. Вы на верном пути с vpcmpd!
1. Сравнение значений и создание маски:
• Используйте инструкции vpcmpd (для упакованных данных двойной точности) или vpcmpud (для упакованных данных одинарной точности) для сравнения элементов в регистрах zmm. Эти инструкции позволяют сравнивать элементы поразрядно и устанавливать соответствующие биты в маске в зависимости от результата сравнения.
• Например, чтобы создать маску, где биты установлены для элементов zmm0, которые больше, чем соответствующие элементы zmm1, используйте:
vpcmpd k1, zmm0, zmm1, 6 ; 6 - сравнение >
content_copyUse code with caution.Assembly
• Аналогично, для создания маски, где биты установлены для элементов zmm0, которые меньше, чем соответствующие элементы zmm2:
vpcmpd k2, zmm0, zmm2, 1 ; 1 - сравнение <
content_copyUse code with caution.Assembly
2. Комбинирование масок (опционально):
• Если нужно объединить условия, используйте логические операции над масками.
• Например, чтобы получить маску, где биты установлены для элементов zmm0, которые одновременно больше zmm1 и меньше zmm2:
kand k3, k1, k2 ; k3 = k1 AND k2
content_copyUse code with caution.Assembly
3. Использование маски для выборочной обработки данных:
• Используйте сгенерированную маску в инструкциях AVX-512 с модификатором {k}{z}. Это позволяет выполнять операции только над элементами, соответствующими установленным битам в маске.
• Например, чтобы добавить zmm11 к элементам zmm0, которые больше zmm1 (используя маску k1):
vaddps zmm0, zmm0, zmm11, {k1}{z}
content_copyUse code with caution.Assembly
Эффективность
• vpcmpd/vpcmpud: Эти инструкции обычно выполняются за 1 цикл на современных процессорах.
• kand: Логические операции над масками также выполняются очень быстро, обычно за 1 цикл.
• AVX-512 инструкции с масками: Производительность зависит от конкретной инструкции и процессора, но в целом использование масок не приводит к значительным накладным расходам.
Альтернативы
• Ветвление: Можно использовать условные переходы для обработки элементов в зависимости от результата сравнения. Однако это может быть менее эффективно из-за предсказания ветвлений и потенциальных штрафов за промахи.
• Смешанные инструкции: Некоторые инструкции AVX-512, такие как vblendmps, позволяют объединять данные из двух регистров zmm на основе маски.
В вашем случае использование масок, созданных с помощью vpcmpd, скорее всего, является наиболее эффективным способом достижения желаемого результата.
@SynergystМыслитель (8608) 4 недели назад
Если ты реально думаешь, что я не спрашивал это у GPT и Gemini, то тебе стоит сходить к мозгоправу.
@Synergyst, урыл (без рофла туда гпт)
Похожие вопросы