【发布时间】:2019-10-13 22:28:41
【问题描述】:
我需要一种方法来比较 C++ 中 __m128i 类型的值,以获得 __m128i 类型的任何值之间的总顺序。订单类型无关紧要,只要它在__m128i 类型的所有值之间建立总订单即可。因此,只要提供总顺序,比较可能会小于 128 位整数或完全其他的东西。
我尝试使用< 运算符,但它没有返回bool,而是似乎比较了__m128i 的向量分量(即SIMD):
#include <emmintrin.h>
inline bool isLessThan(__m128i a, __m128i b) noexcept {
// error: cannot convert '__vector(2) long int' to 'bool' in return
return a < b;
}
另一种可能性是使用memcmp/strcmp 或类似的,但这很可能不是最佳的。针对至少具有 SSE4.2 和 AVX2 的现代 Intel x86-64 CPU,是否有任何内在函数/指令可以用于此类比较?怎么做?
PS:类似的问题已经被问到检查相等但不是为了排序:
【问题讨论】:
-
一个简单的解决方案(使用 gcc/clang)将转换为
__int128并与<进行比较:godbolt.org/z/Kh0Yd5。不一定是最有效的(但这也取决于您的输入通常来自寄存器还是内存)
标签: c++ x86 x86-64 simd intrinsics