簡體   English   中英

AArch64 SVE/2 - 列表中的左包元素

[英]AArch64 SVE/2 - Left pack elements from list

我正在嘗試使用 AArch64 SVE (或SVE2 )實現 SIMD 算法,該算法采用元素列表並僅選擇滿足特定條件的元素。 它通常稱為左包裝 ( SSE/AVX/AVX-512 ),還是 Stream 壓實 ( CUDA )?

是否可以使用 SVE 對該操作進行矢量化?

等效的 SQL 和標量代碼可能如下所示:

SELECT * FROM Book
WHERE Price < 42
int LeftPack_Scalar(int* input, int* output, int N, int limit)
{
    int outPos = 0;
    for (int i = 0; i < N; ++i) {
       if (input[i] < limit)
          out[outPos++] = input[i];
    }
    return outPos;
}

可以使用 AVX-512 在 SIMD 中對其進行矢量化

int LeftPack_AVX512(int* input, int* output, int N, int limit)
{
    int outPos = 0;
    __m512i vlimit = mm512_load(limit);
    for (int i=0; i < N; i+=16) {
       __m512i vinput = mm512_load(input+i); 
       __mmask16 mask = mm512_cmp(vinput, vlimit); 
       mm512_mask_compressstore(output+outPos, mask, vinput);
       int count = mm512_popcnt(mask);
       outPos += count;
    }
    return outPos;
}

如何使用 AArch64 SVE 實現它? 有沒有類似於 AVX-512 compress_store的 function 來壓縮稀疏數據?

int LeftPack_SVE(int* input, int* output, int N, int limit)
{
  // ...
}

注意:SVE 既有collect也有scatter ,詳情請參閱SVE 的簡短介紹 但我找不到等效的 SVE / 2 指令來保持元素的相對順序。

使用svcompact壓縮活動元素,然后使用普通線性存儲來存儲結果。

暫無
暫無

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

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