首页 > 解决方案 > AArch64 SVE/2 - 列表中的左包元素

问题描述

我正在尝试使用 AArch64 SVE(或SVE2)实现 SIMD 算法,该算法采用元素列表并仅选择满足特定条件的元素。它通常被称为 Left Packing ( SSE/AVX/AVX-512 ) 或 Stream Compaction ( 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的函数来压缩稀疏数据?

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

注意:SVE 既有 collect 也有scatter详情请参阅SVE 的简短介绍。但我找不到等效的 SVE / 2 指令来保持元素的相对顺序。

标签: c++armarm64stream-compactionsve

解决方案


用于svcompact压缩活动元素,然后使用普通线性存储来存储结果。


推荐阅读