使用内在函数时未处理的异常
Posted
技术标签:
【中文标题】使用内在函数时未处理的异常【英文标题】:Unhandled exception in using intrinsic 【发布时间】:2011-03-27 20:50:55 【问题描述】:我有一个使用 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 执行时,我得到未处理的异常或非法操作错误,我不知道为什么会发生。 有人可以告诉我出了什么问题吗?
【问题讨论】:
尝试使用 MSDN 页面上示例中使用的值,而不是 1、2、3、4:msdn.microsoft.com/en-us/library/bb514039.aspx 一旦完成测试,您接受答案对我们来说很重要,好吗?谢谢。 【参考方案1】:_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);
【讨论】:
哎呀我的坏..下载软件cpuid.com发现我的CPU只有“MMX, SSE (1,2,3,3S), EM64T"的指令【参考方案2】:您不应该使用成员m128i_i32
而不是m128i_u32
吗?
该指令将两组 32 位有符号整数相乘。
来自MSDN。
如果你真的需要m128i_u32
,那么你必须改用_mm_mul_epu32()
。
【讨论】:
@fruit_trader 几分钟前更新了答案。它对你有用吗? 在这种情况下,使用m128i_i32
或m128i_u32
没有区别,因此这可能不是一个有用的答案。
感谢您的回复。我错过了检查我的 CPU - 它没有 SSE4以上是关于使用内在函数时未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章
DbUpdateException- 在我捕获所有异常时未处理重复的键错误
如何修复调用 Thread.sleep() 时未处理异常的编译错误?