【问题标题】:SSE intrinsics - _mm_and_ps odd behaviourSSE 内在函数 - _mm_and_ps 奇怪的行为
【发布时间】:2018-06-08 01:29:09
【问题描述】:

以下代码:

__m128 a   = _mm_setr_ps( 1, 2, 3, 4 );
__m128 b   = _mm_set1_ps( 2 );
__m128 res = _mm_and_ps( a, b );
cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << endl;
cout << b[0] << " " << b[1] << " " << b[2] << " " << b[3] << endl;
cout << res[0] << " " << res[1] << " " << res[2] << " " << res[3] << endl;
cout<<endl;
cout << ( 1 & 2 ) << " " << ( 2 & 2 ) << " " << ( 3 & 2 ) << " " << ( 4 & 2 ) << endl;

结果:

1 2 3 4
2 2 2 2
0 2 2 2

0 2 2 0

SSE 操作的结果不应该是0 2 2 0,因为2 = 010, 4 = 100 =&gt; 2&amp;4 = 0
根据文档:

__m128 _mm_and_ps(__m128 a, __m128 b)

计算 a 和 b 的四个 SP FP 值的按位与。

R0 R1 R2 R3

a0 & b0 a1 & b1 a2 & b2 a3 & b3

【问题讨论】:

  • 为什么不显示ab的中间值?
  • 检查编辑.....

标签: c++ sse


【解决方案1】:

我找到的documentation 说:

计算 a 和 b 的四个 单精度浮点值的按位与。

(我的重点)

2 和 4 将具有相同的尾数(0,加上隐含的前导 1 位),指数分别为 128 和 129。按位与是零尾数和指数 128 (== 2.0)。


编辑

如果你想对非负整数进行按位与,你可以添加一个偏移量。如果您使用 8388608 (== 1

const float offset=8388608;
__m128 mm_offset = _mm_set1_ps();
__m128 a   = _mm_setr_ps( 1, 2, 3, 4 );
a =_mm_add_ps(mm_offset,a);
__m128 b   = _mm_set1_ps( 2+offset );
__m128 res = _mm_and_ps( a, b );
res = _mm_sub_ps(res,mm_offset);

【讨论】:

  • 如果你愿意,你也可以在整数数据上使用 SSE1 andps。 (There are minor performance implications)。它仍然是 AND,它不关心位的含义,直到您使用实际的 FP 指令。如果您从不这样做,并且只存储结果,那么您就可以了。
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2011-06-14
  • 2020-01-31
  • 2014-05-24
  • 1970-01-01
相关资源
最近更新 更多