簡體   English   中英

AVX2 64位無符號整數比較

[英]AVX2 64-bit unsigned integer comparison

我正在嘗試比較兩個__m256i (4個打包的64位整數)。 為此,我使用_mm256_cmpgt_epi64函數。

除了進行一些比較外,該函數按預期工作,好像該函數未考慮64位整數的最大位。 如下第二和第三比較所示。

這里一個MCVE,其中I期望從每個64位整數a為比從它的對等較大的b (因此cp0xFFF...FFF ):

#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;
}

但是我的輸出如下(按cpab順序):

ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 
000000000000000f f000000000000000 d00000000000000d 0f00000000000000 
0000000000000002 2000000000000000 2000000000000002 0200000000000000 

我不熟悉Intel Intrinsics函數,因此如果有人可以告訴我我做錯了什么,將不勝感激:)

您的問題是_mm256_cmpgt_epi64比較帶符號的整數,因此,如果您在i64之一上設置了最高有效位,則它被認為是負數。 例如, 0xf000000000000000為負, 0x2000000000000000不是,並且_mm256_cmpgt_epi64 (正確)告訴您后者更大。

看起來沒有一個嚴格的等效函數比較無符號的int,但是您可以使用_mm256_cmpgt_epu64_mask ,該__mmask8返回__mmask8位字段。

編輯:忘記提及_mm256_cmpgt_epu64_mask需要AVX512,它可能對您不可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM