AArch64 SVE/2 - 列表中的左包元素
AArch64 SVE/2 - Left pack elements from list
我正在尝试使用 AArch64 实现 SIMD 算法 SVE (or SVE2) that takes a list of elements and only selects the ones that meet a certain condition. It's often called Left Packing (), or Stream Compaction ()?
是否可以用 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 有 gather 和 scatter,请参阅 short introduction to the SVE 了解更多详情。但是我找不到一个等效的 SVE / 2 指令来保持元素的相对顺序。
使用svcompact
压缩活动元素,然后使用普通线性存储来存储结果。
我正在尝试使用 AArch64 实现 SIMD 算法 SVE (or SVE2) that takes a list of elements and only selects the ones that meet a certain condition. It's often called Left Packing (
是否可以用 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 有 gather 和 scatter,请参阅 short introduction to the SVE 了解更多详情。但是我找不到一个等效的 SVE / 2 指令来保持元素的相对顺序。
使用svcompact
压缩活动元素,然后使用普通线性存储来存储结果。