从 __m128 转换为 __m128i 会导致错误的值
Converting from __m128 to __m128i results in wrong value
我需要将浮点向量 (__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 位整数。
在此示例中,调试器将 __m128i
值解释为两个 64 位整数,而不是您期望的四个 32 位整数。实际转换是正确的。
在您的代码中,您需要明确指定如何解释 SIMD 值,例如:test_i.m128i_i32[0]
我需要将浮点向量 (__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 位整数。
在此示例中,调试器将 __m128i
值解释为两个 64 位整数,而不是您期望的四个 32 位整数。实际转换是正确的。
在您的代码中,您需要明确指定如何解释 SIMD 值,例如:test_i.m128i_i32[0]