Умножьте два вектора 32-битных целых чисел, получив вектор из 32-битных элементов результата.

Каков наилучший способ умножить каждую 32-битную запись двух регистров _mm256i друг на друга?

_mm256_mul_epu32 - это не то, что я ищу, потому что он выдает 64-битные выходные данные. Мне нужен 32-битный результат для каждого 32-битного элемента ввода.

Более того, я уверен, что перемножение двух 32-битных значений не приведет к переполнению.

Спасибо!


person user1829358    schedule 12.02.2015    source источник
comment
Возможный дубликат самого быстрого способа умножения двух векторов в c++   -  person Peter Cordes    schedule 09.06.2016


Ответы (1)


Вам нужна встроенная функция _mm256_mullo_epi32(). Из превосходного интернет-руководства по встроенным функциям от Intel:

Синопсис

__m256i _mm256_mullo_epi32 (__m256i a, __m256i b)
#include "immintrin.h" 
Instruction: vpmulld ymm, ymm, ymm CPUID Flags: AVX2 

Описание

Умножьте упакованные 32-битные целые числа в a и b, получив промежуточные 64-битные целые числа, и сохраните младшие 32 бита промежуточных целых чисел в dst.

person Jason R    schedule 12.02.2015
comment
Вы случайно не знаете эквивалент AVX? - person Bram; 29.05.2016
comment
@ Брэм Нет ни одного. В AVX нет целочисленных инструкций; они были добавлены в AVX2. Вам придется использовать эквиваленты SSE. - person Jason R; 29.05.2016