【发布时间】:2014-06-28 17:28:39
【问题描述】:
我正在考虑为 uint32_t 实现 8 元堆排序。为此,我需要一个函数来选择 8 元素向量中最大元素的索引,以便我可以将其与父元素进行比较,并有条件地执行交换和进一步的 siftDown 步骤。
(8 uint32_ts 可以更改为例如 16 uint32_ts 或 8 uint64_t 或 x86 SIMD 可以有效支持的任何内容)。
我对如何做到这一点有一些想法,但我正在寻找比非矢量化代码更快的东西,特别是我正在寻找能够让我进行快速堆排序的东西。
我有 clang++ 3.3 和 Core i7-4670,所以我应该能够使用最新的 x86 SIMD 东西。
(顺便说一句:这是一个更大项目的一部分:https://github.com/tarsa/SortingAlgorithmsBenchmark,例如四元堆排序,所以在实施 SIMD 堆排序后,我可以立即比较它们)
重复一遍 - 问题是:在 x86 SIMD 向量中计算最大元素索引的最有效方法是什么?
PS: 这不是链接问题的重复 - 请注意,我要求的是最大元素的 index,而不仅仅是元素值。
【问题讨论】:
-
不,它不是重复的。请注意,我正在寻找最大元素的索引,而不仅仅是它的值。
-
我猜你可以使用 __m128 或 __m256。
-
我不认为你想要索引的事实对答案有很大的影响 - SSE 指令集是围绕垂直而不是水平计算构建的。
-
我刚刚在 SSE4.1 中发现了一个水平搜索指令:PHMINPOSUW。可能这可以解决问题,但现在的问题是例如使用两个 16 位最大选择 + 一些掩码进行 32 位最大选择。