c++ - 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 指令来保持元素的相对顺序。
解决方案
用于svcompact
压缩活动元素,然后使用普通线性存储来存储结果。
推荐阅读
- hangouts-chat - 多行消息环聊聊天聊天机器人
- javascript - 使用 XMLHttpRequest 在容器中创建容器
- c# - 在 C# 中获取 XML 属性值
- python - 在python中的特定行之后删除文件的内容
- javascript - 无法正确定位 y 轴并且缺少 y 轴上的最大数量
- kotlin - InternalCoroutinesApi 注解是什么意思
- angular - 订阅数据更新时,角度材料数据表不呈现
- python - 如果上一个任务花费超过 5000 秒,芹菜工人不会处理该任务
- java - 使用 Java Servlet/jsp 将产品添加到数据库
- c++ - 如何对链表进行排序?