【发布时间】:2009-10-16 22:08:39
【问题描述】:
给定一个 4 字节的寄存器(或 SIMD 的 16 个字节),必须有一种有效的方法通过几条指令对寄存器中的字节进行排序。
提前致谢。
【问题讨论】:
给定一个 4 字节的寄存器(或 SIMD 的 16 个字节),必须有一种有效的方法通过几条指令对寄存器中的字节进行排序。
提前致谢。
【问题讨论】:
找到了!它位于 Furtak、Amaral 和 Niewiadomski 的 2007 年论文“使用 SIMD 寄存器和指令在排序算法中启用指令级并行性”。第 4 节。
它使用 4 个 SSE 寄存器,有 12 个步骤,在 19 条指令中运行,包括加载和存储。
同一篇论文在使用 SIMD 动态制作排序网络方面做了一些出色的工作。
【讨论】:
查找一个有效的sorting network,因为 N = 您关心的字节数(4 或 16)。将其转换为一系列比较和交换指令。 (不过,对于 N=16,这将不仅仅是“几个”。)
【讨论】:
为了加快字符串的排序,我最终在 SSE2 中对每个双精度数打包 7 个字节并排序(排序)了一个包含 16 个双精度数的数组,使用双音排序创建两个 8 运行,并使用二进制合并来合并两个运行.您可以在此处查看第一部分 http://mischasan.wordpress.com/2011/07/29/okay-one-more-poke-at-sse2-sorting-doubles/ (asm) 和此处 http://mischasan.wordpress.com/2011/09/02/update-on-bitonic-sse2-sort-of-16-doubles/ (C),以及此处的双调合并步骤(如果您想一直使用 SSE):http://mischasan.wordpress.com/2012/11/04/sse2-odd-even-merge-the-last-step-in-sorting/ 。我用这种排序替换了 qsort 底部的插入排序,它的速度大约是直接 qsort 的 5 倍。高温
我没有看过 UofA 的论文;双音逻辑来自老派 (CTM) GPGPU 编程。
对嵌入的链接字符串感到抱歉;我不知道如何在 cmets stackoverflow 中添加可点击的链接。
【讨论】:
所有排序算法都需要将值从一个地方“交换”到另一个地方。由于您在谈论文字 CPU 寄存器,这意味着任何类型都需要另一个寄存器用作临时位置来保存正在交换的字节。
我从未见过具有内置方法对寄存器中的字节进行排序的芯片。不是说没做过,但我想不出这样的指令有多少用途。
【讨论】: