【发布时间】:2020-10-29 00:59:48
【问题描述】:
我目前正在使用英特尔 SIMD 功能:_mm_cmplt_ps( V1, V2 )。
该函数返回一个包含每个组件测试结果的向量。根据 V1 组件是否小于 V2 组件,例如:
XMVECTOR Result;
Result.x = (V1.x < V2.x) ? 0xFFFFFFFF : 0;
Result.y = (V1.y < V2.y) ? 0xFFFFFFFF : 0;
Result.z = (V1.z < V2.z) ? 0xFFFFFFFF : 0;
Result.w = (V1.w < V2.w) ? 0xFFFFFFFF : 0;
return Result;
但是有这样的函数返回 1 或 0 吗?一个使用 SIMD 且没有变通办法的函数,因为它应该被优化 + 矢量化。
【问题讨论】:
-
不,如果您需要,您可以使用
_mm_set1_epi32(1)的向量andps来清除高位。或从0中减去整数。但如果你想有条件地增加计数器,使用psubd来做counter -= cmp_result因为x -= -1是x += 1,而不是先否定或屏蔽。 -
你打算用 1 或 0 做什么,而你不能用 -1 或 0 做什么?
-
或者您的意思是返回
1.0f的位模式?通常您实际上并不需要它,请参阅SSE Comparison Intrinsics - How to get 1 or 0 from a comparison?。 -
另一种方法是使用
_mm_srli_epi32将结果右移 31 位,这样就无需使用寄存器来保存它们。 -
请尝试在问题中解释您的实际问题,而不是您尝试解决其中的一部分(IMO,您有一个xy-problem)-看起来更像您需要一个混合(但是你最后的评论有点含糊)
标签: intel sse simd intrinsics