我试图用AArch64 斯维 (或SVE2)实现SIMD算法,该算法接收元素列表,并且只选择满足特定条件的元素。它通常被称为左包装(SSE/AVX/AVX-512)或流压缩(库达)?
能用SVE矢量化这个操作吗?
等价的SQL和标量代码可以如下所示:
SELECT * FROM Book
WHERE Price < 42int 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 https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=mm512_mask_compressstoreu_epi32&expand=1241,1229的函数来压缩稀疏数据?
int LeftPack_SVE(int* input, int* output, int N, int limit)
{
// ...
}注意: SVE既有收集又有分散,有关更多细节,请参见SVE简介。但是我找不到一个等价的SVE /2指令来保持元素的相对顺序。
发布于 2021-05-13 13:05:49
使用svcompact压缩活动元素,然后使用普通线性存储来存储结果。
https://stackoverflow.com/questions/67518513
复制相似问题