【发布时间】:2020-01-08 07:28:34
【问题描述】:
一个最小的例子会更有益:
假设我有一个排序的 8 个整数 = {10, 20, 30, 40, 50, 60, 70, 80}(我的用例是排序整数,但考虑到向量指令作用于整个数据集,我不确定这些信息是否有价值)
需要的操作很少:
- 插入和移位。
-> 在它的排序位置插入 25。 -> 在索引 2 处插入 25 并换档。
10, 20, 30, 40, 50, 60, 70, 80 变为:10, 20, 25, 30, 40, 50, 60, 70
- 在背面拆卸和移动并插入。
-> 如果找到并删除了 20,则从数组中删除 20 并在后面插入 90。
10, 20, 30, 40, 50, 60, 70, 80 变为 10, 30, 40, 50, 60, 70, 80, 90
或者一组指令可以让它工作?
我正在尝试对降序排序数组进行多步插入和移位部分。 https://godbolt.org/z/_WCxkW
【问题讨论】:
-
有 AVX2
vpermd用于 256 位向量,SSE2pshufd用于 128 位向量(双字元素),可以移动其他元素以设置vpblendd插入一。但是,没有什么特别有效的方法,也没有将插入位置转换为随机播放控制向量的好方法。如果您尝试构建 SIMD 排序,则 SIMD 向量中的插入排序并不好。 -
int你的意思是int32?您是否将其中的 8 个存储在两个 SSE 寄存器中?或者你使用int16?另外:签名还是未签名?或者你有可用的 AVX2 吗?您如何确定要删除的对象(按值或按索引)?如果是由值决定,如果元素不存在怎么办?如果你在最后插入一个零,在删除之后,你的数组将不再被排序。 -
Int32。目前我不直接处理 SSE 寄存器,主要是通过 OpenMP 工作。
> Also: Signed or unsigned?无论工作如何,值本质上都是无符号的。> Or do you have AVX2 available?我愿意。> How do you determine the to-be-removed object (by value or by index)?按排序数组的值搜索。正如我所说,需要从示例中的数组中删除20。> If it is determined by value, what shall happen if the element does not exist?什么都没有。数组保持原样。 -
你的数组是否真的存储在内存中? (这将简化移位,只需从偏移地址加载)。如果一个待删除号码存在多次怎么办?此外,“什么都不做”,如果元素不存在会使这稍微复杂一些——我会有一个相对直接的解决方案来“删除不小于
x的第一个元素”(或最后一个不大于 -如果x只存在一次,则等效) -
SIMD 向量不能有效地支持您要求的各种操作;您真正想解决什么问题?您可能应该以不同的方式解决高级问题。