Необработанное исключение при использовании встроенного - PullRequest
3 голосов
/ 28 марта 2011

У меня есть приложение, созданное с использованием VC ++, и я хотел изучить возможности оптимизации путем векторизации некоторых операций.

Для начала я пробую следующий код:

__m128i p1;

p1.m128i_u32[0] = 1;
p1.m128i_u32[1] = 2;
p1.m128i_u32[2] = 3;
p1.m128i_u32[3] = 4;

__m128i p2;

p2.m128i_u32[0] = 1;
p2.m128i_u32[1] = 2;
p2.m128i_u32[2] = 3;
p2.m128i_u32[3] = 4;

__m128i res2= _mm_mul_epi32(p1,p2);

Тем не менее, я получаю необработанное исключение или ошибку недопустимой операции при выполнении _mm_mul_epi32, я понятия не имею, почему это происходит. Может кто-нибудь сказать, пожалуйста, что не так?

Ответы [ 2 ]

3 голосов
/ 28 марта 2011

_mm_mul_epi32 отображается на инструкцию PMULDQ, которая доступна только в SSE4 и AVX. Чтобы иметь SSE4 или AVX, у вас должен быть достаточно новый процессор Intel, например. Нехалем, Сэнди Бридж (Core i5, i7).

Также обратите внимание, что вам может быть проще и лаконичнее использовать встроенные функции для инициализации векторов SIMD, например,

__m128i p1 = _mm_set_epi32(1, 2, 3, 4);
__m128i p2 = _mm_set_epi32(1, 2, 3, 4);
__m128i res2 = _mm_mul_epi32(p1, p2);
1 голос
/ 28 марта 2011

Разве вы не должны использовать элемент m128i_i32 вместо m128i_u32?

Эта инструкция умножает два набора 32-битных целых чисел со знаком.

От MSDN .

Если вам действительно нужен m128i_u32, тогда вы должны использовать _mm_mul_epu32().

...