我有一个使用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时,我得到未处理的异常或非法操作错误,我不知道它为什么会发生。 有人可以告诉我有什么问题吗?
答案 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)