tl; dr:对uint8x16_t进行排序的最快方法是什么?
我需要对许多16个无符号字节的数组进行排序(按降序排列,当然这无关紧要),我正在尝试通过ARM NEON向量化来优化排序。
我觉得这是一个非常奇特的谜题,因为似乎“必须”存在一个NEON指令的短组合(例如vmax / vpmax / vmin / vpmin,vzip / vuzp),这些指令可靠地导致排序阵列。
例如,如果我们将两个8字节数组的对(A,B)转换为(vpmax(A,B),vpmin(A,B)),我们就会以不同的顺序获得相同的16个值。如果我们重复这个操作四次,我们可靠地使第一个单元格中的数组最大,并且最后一个单元格中的数组最小;我们不能确定中间元素。
另一个例子:如果我们先做(C,D)=(vmax(A,B),vmin(A,B)),那么我们做(E,F)=(vpmax(C,D),vpmin (C,D)),然后我们做(G,H)= vzip(E,F),然后我们将我们的数组分成四个字节的四个部分,在每个部分我们已经知道最大的元素和最小的元素。可能下一个天真的步骤是将这个数组解交织到阵列开头的前四个字节(这不一定是数组的前4个元素,只是它们各自组的顶部字节)并重复,但还不确定最后它在哪里领先。
是否有针对此特定问题或其他类似问题的已知方法(针对不同的阵列大小或其他类型)?任何想法都赞赏:))