2015-02-12 1 views
3

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

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

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

Спасибо!

+0

Возможный дубликат [быстрый способ умножить два вектора в C++] (http://stackoverflow.com/questions/17264399/fastest-way-to-multiply-two-vectors-in-c) –

ответ

5

Вы хотите, чтобы _mm256_mullo_epi32() искривился. От компании Intel превосходной online intrinsics guide:

Синопсисе

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

Описание

Multiply упакованные 32-битные целые числа а и б, получения промежуточных 64-битных чисел, и сохранить низкие 32 бита от промежуточные целые числа в dst.

+0

ли вам Знаете ли вы эквивалент AVX? – Bram

+1

@Bram Нет ни одного. AVX не имеет целочисленных инструкций; они были добавлены в AVX2. Вам придется использовать эквиваленты SSE. –

Смежные вопросы