使用内在函数时未处理的异常

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_i32m128i_u32 没有区别,因此这可能不是一个有用的答案。 感谢您的回复。我错过了检查我的 CPU - 它没有 SSE4

以上是关于使用内在函数时未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试添加第二个活动时未处理的事件循环异常

c++ 在分配变量时未处理的异常访问冲突

DbUpdateException- 在我捕获所有异常时未处理重复的键错误

如何修复调用 Thread.sleep() 时未处理异常的编译错误?

Mantle:解析 JSON 时未捕获的异常“NSInvalidArgumentException”

使用getResources时未找到FileSystem异常