比较 AVX/AVX2 中的 2 个 vector (c)

标签 c simd avx avx2

我有两个 __m256i vector (每个都包含字符),我想知道它们是否完全相同。我只需要 true如果所有位都相等,并且 0除此以外。

这样做的最有效方法是什么?这是加载数组的代码:

char * a1 = "abcdefhgabcdefhgabcdefhgabcdefhg";
__m256i r1 = _mm256_load_si256((__m256i *) a1);

char * a2 = "abcdefhgabcdefhgabcdefhgabcdefhg";
__m256i r2 = _mm256_load_si256((__m256i *) a2);

最佳答案

当前 Intel 和 AMD CPU 上最有效的方法是按元素进行相等性比较,然后检查所有元素的比较是否为真。

这将编译为多个指令,但它们都很便宜,并且(如果您对结果进行分支)compare+branch 甚至可以将宏融合为单个 uop。

#include <immintrin.h>
#include <stdbool.h>

bool vec_equal(__m256i a, __m256i b) {
    __m256i pcmp = _mm256_cmpeq_epi32(a, b);  // epi8 is fine too
    unsigned bitmask = _mm256_movemask_epi8(pcmp);
    return (bitmask == 0xffffffffU);
}

生成的 asm 应该是 vpcmpeqd / vpmovmskb / cmp 0xffffffff / je ,在 Intel CPU 上只有 3 uop。
vptest是 2 uop 并且不与 jcc 宏熔断器,因此等于或更差于 movmsk/cmp用于测试压缩比较的结果。 (见 http://agner.org/optimize/

关于比较 AVX/AVX2 中的 2 个 vector (c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47243456/

相关文章:

simd - 如何使用avx(但没有avx-512)将int 64转换为int 32

c++ - 强制 AVX 内在函数改用 SSE 指令

c - 在 C 中使用 GMP 5.0.2 的斐波那契函数

algorithm - 按组件排序多值 (SIMD) 数组

c++ - 广播 __m128 vector 的任意一个元素

segmentation-fault - 为什么 vmovapd 会导致段错误?

c - 返回c中的结构体

c - 从任何 USB 设备获取 PID/VID 号

c# - 桥接非托管 C dll 和托管 C# dll

ios - 修复 Swift simd 库中的错误(以及缺少文档?)