簡體   English   中英

AVX2 收集指令使用詳情

[英]AVX2 Gather Instruction Usage Details

我試圖了解 AVX2 intel 內在的收集功能。

根據官方文檔鏈接,function 的定義是,

__m256i _mm256_i32gather_epi32 (int const* base_addr, __m256i vindex, const int scale)

Gather 32-bit integers from memory using 32-bit indices. 32-bit elements are loaded from addresses starting at base_addr and offset by each 32-bit element in vindex (each index is scaled by the factor in scale). Gathered elements are merged into dst. scale should be 1, 2, 4 or 8.

因此,根據我的理解,它返回一個 __m256i 向量,其中填充了數組中的 8 個整數,其中索引(8)中的基本索引base_addr填充在vindex中。 如果提到任何scale ,那么它也會成倍增加。 現在,為了測試理解我寫了一個代碼,

#include<stdio.h>
#include <immintrin.h>
int main()
{
    __m256i var, ind_intel;
    int * arr = (int *) aligned_alloc(sizeof(__m256i), sizeof(int) * 64);
    int * out = (int *) aligned_alloc(sizeof(__m256i), sizeof(int) * 8);
    int * ind = (int *) aligned_alloc(sizeof(__m256i), sizeof(int) * 8);
    int i;
    ind[0] = 0;ind[1] = 2;ind[2] = 4;ind[3] = 6;ind[4] = 8;ind[5] = 10;ind[6] = 12;ind[7] = 14;
    ind_intel = _mm256_load_si256((__m256i *)&ind[0]);
    for(i=0;i<64;i++)
        arr[i] = i;
    var = _mm256_i32gather_epi32(arr,ind_intel,1);
    _mm256_store_si256((__m256i *)&out[0], var);
    for(i=0;i<8;i++)
        printf("%d ",out[i]);
    return 0;
}

現在, __m256i變量ind_intel將索引設為0,2,..,14 主數組arr加載了0,1,..,63 因此,gather 應將數據加載為arr[0],arr[2],..,arr[14] 但它正在打印價值,

0 65536 1 131072 2 196608 3 262144

當然,我錯過了一些大事。 但是我找不到任何網站或文件清楚地提到收集的用法。 他們每個人都重復了與官方文檔相同的描述。 誰能解釋代碼和理解中的問題?

注意代碼僅用於測試目的。

vindex中的偏移量以字節為單位。 因此,您從地址{arr, arr+2, arr+4, ...}收集 32 位 integer 值。 將這些索引從{0,2,4...}更改為{0,8,16,...} ,或將比例因子更新為:

var = _mm256_i32gather_epi32(arr,ind_intel, 4 ); // 1 -> 4

這將打印出預期值。

我更喜歡第二種選擇,即更新比例因子。 它基本上是它的目的——允許vindex中的索引具有相對於數據字節大小的邏輯偏移值,而不是字節偏移值。

暫無
暫無

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

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