按分量排序多值 (SIMD) 数组
sorting component-wise multi value (SIMD) array
我正在尝试找到一种 O(n∙log(n))
排序方法来同时对多个数组进行排序,以便多值数组中的元素将代表来自 4 个不同单值数组的元素,并且排序方法将对多值元素。
例如:
对于给定的 4 个单值数组 An
、Bn
、Cn
和 Dn
,
我会设置一个新数组 Qn
这样 Qᵢ = [ Aᵢ Bᵢ Cᵢ Dᵢ ]
.
Qᵢ
可能会在此过程中更改,以便 Qᵢ = [ Aaᵢ Bbᵢ Ccᵢ Ddᵢ ]
其中 aᵢ
、bᵢ
、cᵢ
和 dᵢ
是索引列表
当然还有 Qᵢ ≤ Qᵢ₊₁ = [ Aaᵢ₊₁ Bbᵢ₊₁ Ccᵢ₊₁ Ddᵢ₊₁ ]
这样 Aaᵢ ≤ Aaᵢ₊₁
、Bbᵢ ≤ Bbᵢ₊₁
等等。
动机当然是使用 SIMD 指令以从这种结构中受益,以分别对 4 个数组进行排序。
我尝试使用 SIMD 比较器(例如 _mm_cmplt_ps
)和屏蔽交换(例如 _mm_blendv_ps
)
制作传统排序算法的修改版本(快速排序、堆排序、归并排序等)
但我总是遇到理论上决策树中似乎有 O(n∙log(n))
个步骤的问题。
因此,一个决定,是否设置一个枢轴(快速排序)或是否将父项与其子项之一交换(堆排序)
对于所有 4 个组件同时在一起是不正确的(因此,下一步 - 向右或向左 - 是不正确的)。
现在我只有 O(n²)
个方法可以工作。
有什么想法吗?
听起来好像 sorting network is the answer to the question that you asked, since the position of the comparators is not data dependent. Batcher's bitonic mergesort 是 O(n log2 n).
我正在尝试找到一种 O(n∙log(n))
排序方法来同时对多个数组进行排序,以便多值数组中的元素将代表来自 4 个不同单值数组的元素,并且排序方法将对多值元素。
例如:
对于给定的 4 个单值数组 An
、Bn
、Cn
和 Dn
,
我会设置一个新数组 Qn
这样 Qᵢ = [ Aᵢ Bᵢ Cᵢ Dᵢ ]
.
Qᵢ
可能会在此过程中更改,以便 Qᵢ = [ Aaᵢ Bbᵢ Ccᵢ Ddᵢ ]
其中 aᵢ
、bᵢ
、cᵢ
和 dᵢ
是索引列表
当然还有 Qᵢ ≤ Qᵢ₊₁ = [ Aaᵢ₊₁ Bbᵢ₊₁ Ccᵢ₊₁ Ddᵢ₊₁ ]
这样 Aaᵢ ≤ Aaᵢ₊₁
、Bbᵢ ≤ Bbᵢ₊₁
等等。
动机当然是使用 SIMD 指令以从这种结构中受益,以分别对 4 个数组进行排序。
我尝试使用 SIMD 比较器(例如 _mm_cmplt_ps
)和屏蔽交换(例如 _mm_blendv_ps
)
制作传统排序算法的修改版本(快速排序、堆排序、归并排序等)
但我总是遇到理论上决策树中似乎有 O(n∙log(n))
个步骤的问题。
因此,一个决定,是否设置一个枢轴(快速排序)或是否将父项与其子项之一交换(堆排序)
对于所有 4 个组件同时在一起是不正确的(因此,下一步 - 向右或向左 - 是不正确的)。
现在我只有 O(n²)
个方法可以工作。
有什么想法吗?
听起来好像 sorting network is the answer to the question that you asked, since the position of the comparators is not data dependent. Batcher's bitonic mergesort 是 O(n log2 n).