使用内在的未处理异常

时间:2011-03-27 20:50:56

标签: x86 sse simd

我有一个使用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 个答案:

答案 0 :(得分:3)

_mm_mul_epi32映射到PMULDQ指令,该指令仅在SSE4和AVX中可用。您需要拥有一个合理的最新Intel CPU才能拥有SSE4或AVX,例如: Nehalem,Sandy Bridge(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 :(得分:1)

您不应该使用会员m128i_i32而不是m128i_u32吗?

  

该指令将两组32位有符号整数相乘。

来自MSDN

如果您确实需要m128i_u32,则必须使用_mm_mul_epu32()