【问题标题】:Converting from __m128 to __m128i results in wrong value从 __m128 转换为 __m128i 会导致错误的值
【发布时间】:2015-08-03 22:26:56
【问题描述】:

我需要将浮点向量 (__m128) 转换为整数向量 (__m128i),并且我正在使用 _mm_cvtps_epi32,但我没有得到预期值。这是一个非常简单的例子:

__m128 test = _mm_set1_ps(4.5f);
__m128i test_i = _mm_cvtps_epi32(test);

我得到的调试器输出:

(lldb) po test
 ([0] = 4.5, [1] = 4.5, [2] = 4.5, [3] = 4.5)
(lldb) po test_i
 ([0] = 17179869188, [1] = 17179869188)
(lldb) 

如您所见,得到的整数是.. 17179869188?从 4.5 开始?为什么只有两个值? _mm_cvtps_epi32 应该将 4 个压缩的 32 位浮点值转换为 4 个压缩的 32 位整数。

【问题讨论】:

  • 提示:4 + 4*2^32 = 17179869188
  • 使用 printf 调试器; int tmp[4]; _mm_storeu_si128((__m128i*)tmp,test_i); printf("%d %d %d %d\n", t[0], t[1], t[2], t[3]);

标签: c++ type-conversion clang sse intrinsics


【解决方案1】:

在此示例中,调试器将 __m128i 值解释为两个 64 位整数,而不是您期望的四个 32 位整数。实际转换是正确的。

您需要在您的代码中明确指定如何解释 SIMD 值,例如:test_i.m128i_i32[0]

【讨论】:

  • 是的,就是这样。此外,只需转换结果也可以:(int32_t)test_i[0].
猜你喜欢
  • 2012-11-17
  • 2011-05-24
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多