首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AArch64 SVE/2 -列表中的左包元素

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

Stack Overflow用户
提问于 2021-05-13 11:32:16
回答 1查看 106关注 0票数 1

我试图用AArch64 斯维 (或SVE2)实现SIMD算法,该算法接收元素列表,并且只选择满足特定条件的元素。它通常被称为左包装(SSE/AVX/AVX-512)或流压缩(库达)?

能用SVE矢量化这个操作吗?

等价的SQL和标量代码可以如下所示:

代码语言:javascript
复制
SELECT * FROM Book
WHERE Price < 42
代码语言:javascript
复制
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中将其矢量化。

代码语言:javascript
复制
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 https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=mm512_mask_compressstoreu_epi32&expand=1241,1229的函数来压缩稀疏数据?

代码语言:javascript
复制
int LeftPack_SVE(int* input, int* output, int N, int limit)
{
  // ...
}

注意: SVE既有收集又有分散,有关更多细节,请参见SVE简介。但是我找不到一个等价的SVE /2指令来保持元素的相对顺序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-13 13:05:49

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67518513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档