X86 使用内部文件时发生未处理的异常

X86 使用内部文件时发生未处理的异常,x86,sse,simd,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; __m12

我有一个使用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时,我得到了未处理的异常或非法操作错误,我不知道为什么会发生。
有人能告诉我是怎么回事吗

您是否应该使用成员
m128i_i32
而不是
m128i_i32

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


如果确实需要
m128i\u u32
,则必须使用
\u mm\u mul\u epu32()

\u mm\u mul\u epi32
映射到
PMULDQ
指令,该指令仅在SSE4和AVX中可用。要拥有SSE4或AVX,您需要一个相当新的Intel CPU,例如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);

尝试MSDN页面上示例中使用的值,而不是1,2,3,4:对我们来说,测试完成后接受答案很重要,好吗?“谢谢!”水果商几分钟前更新了答案。它对您有用吗?在这种情况下,无论是使用
m128i_i32
还是
m128i_i32
,都没有区别,因此这可能不是一个有用的答案。感谢您的回复。我没有检查我的CPU-它没有SSE4eh我的坏。。下载了软件,发现我的CPU只有“MMX、SSE(1,2,3,3S)、EM64T”指令