我正在尝试比较两个__m256i
(4个压缩的64位整数)。为此,我使用了_mm256_cmpgt_epi64函数。
除了一些比较之外,该函数按预期工作,好像该函数未考虑64位整数的最大位。如下第二和第三比较所示。
这里是MCVE,我希望a
中的每个64位整数都比b
中的同等整数大(因此cp
应该是0xFFF...FFF
): / p>
#include <immintrin.h>
#include <x86intrin.h>
#include <stdio.h>
#include <inttypes.h>
// gcc mcve.c -mavx2 -madx && ./a.out
int print_avx2_hex256(__m256i ymm)
{
const size_t n = sizeof(__m256i) / sizeof(u_int64_t);
u_int64_t buffer[n];
_mm256_storeu_si256((__m256i*)buffer, ymm);
for (int i=0; i<n; ++i)
printf("%016"PRIx64" ", buffer[i]);
printf("\n");
return 0;
}
int compare(__m256i a, __m256i b)
{
__m256i cp = _mm256_cmpgt_epi64(a,b);
print_avx2_hex256(cp); // Comparison
print_avx2_hex256(a);
print_avx2_hex256(b);
return 0;
}
int main()
{
u_int64_t _a[4] = {0xf, 0xf000000000000000, 0xd00000000000000d, 0x0f00000000000000};
u_int64_t _b[4] = {0x2, 0x2000000000000000, 0x2000000000000002, 0x0200000000000000};
__m256i a = _mm256_setr_epi64x(_a[0], _a[1], _a[2], _a[3]);
__m256i b = _mm256_setr_epi64x(_b[0], _b[1], _b[2], _b[3]);
compare(a,b);
return 0;
}
但是我的输出如下(按cp
,a
,b
的顺序):
ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff
000000000000000f f000000000000000 d00000000000000d 0f00000000000000
0000000000000002 2000000000000000 2000000000000002 0200000000000000
我不熟悉Intel Intrinsics函数,因此如果有人可以告诉我我做错了什么,将不胜感激:)
答案 0 :(得分:3)
您的问题是_mm256_cmpgt_epi64
比较带 signed 的整数,因此,如果在i64之一上设置了最高有效位,则它被视为负数。例如,0xf000000000000000
是负数,0x2000000000000000
不是负数,_mm256_cmpgt_epi64
(正确地)告诉您后者更大。
看起来没有一个严格等效的函数可以比较无符号的整数,但是您可以使用_mm256_cmpgt_epu64_mask
,它返回一个__mmask8
位字段。
编辑:忘记提及_mm256_cmpgt_epu64_mask
需要AVX512,您可能无法使用它。