【问题标题】: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 执行时,我得到未处理的异常或非法操作错误,我不知道为什么会发生。 有人可以告诉我出了什么问题吗?

【问题讨论】:

标签: x86 sse simd


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多