快速的寄存器内字节?
Posted
技术标签:
【中文标题】快速的寄存器内字节?【英文标题】:Fast in-register sort of bytes? 【发布时间】:2009-10-16 22:08:39 【问题描述】:给定一个 4 字节的寄存器(或 SIMD 的 16 个字节),必须有一种有效的方法通过几条指令对寄存器中的字节进行排序。
提前致谢。
【问题讨论】:
【参考方案1】:找到了!它位于 Furtak、Amaral 和 Niewiadomski 的 2007 年论文“使用 SIMD 寄存器和指令在排序算法中启用指令级并行性”。第 4 节。
它使用 4 个 SSE 寄存器,有 12 个步骤,在 19 条指令中运行,包括加载和存储。
同一篇论文在使用 SIMD 动态制作排序网络方面做了一些出色的工作。
【讨论】:
【参考方案2】:查找一个有效的sorting network,因为 N = 您关心的字节数(4 或 16)。将其转换为一系列比较和交换指令。 (不过,对于 N=16,这将不仅仅是“几个”。)
【讨论】:
谢谢。我正在寻找一种高效的 asm 解决方案。哦,请注意我说的是“几个指令”而不是“几个周期”;) 啊,我看到您链接到的论文就是采用这种方法,使用 SSE2 指令。酷。 是的,我不想太冗长,因为我希望用 asm 来做一些小技巧。事实上,我一直在寻找这篇“Efficient Implementation of Sorting on Multi-Core SIMD CPU Architecture”(Chhugani,.. 2008),但对算法的说明感到沮丧:1)a)执行注册内排序以获得排序长度为 K 的序列。我猜对英特尔的研究人员来说这是一个“duh”过程,但对我来说不是! (我仍然不确定他们是否执行了整个 17-19 指令程序来对寄存器进行排序。)[注意:抱歉,由于缺乏业力,没有给你投票] 我从 2007 年的论文中学到了一些东西——足够的奖励。 :-) 顺便说一下,在原始(2008 年)论文上有一个非常有效的同时 4 寄存器排序。在我看来,我的坏。【参考方案3】:为了加快字符串的排序,我最终在 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 *** 中添加可点击的链接。
【讨论】:
【参考方案4】:所有排序算法都需要将值从一个地方“交换”到另一个地方。由于您在谈论文字 CPU 寄存器,这意味着任何类型都需要另一个寄存器用作临时位置来保存正在交换的字节。
我从未见过具有内置方法对寄存器中的字节进行排序的芯片。不是说没做过,但我想不出这样的指令有多少用途。
【讨论】:
我的意思是对寄存器中的字节进行排序,当然必须至少使用另一个寄存器。很抱歉造成误解。 实际上有一种方法可以使用 CMPXCHG 使用 eax 寄存器和旋转它进行寄存器内排序,正如一位对 x86 非常了解的朋友向我展示的那样。从中获益不大,但这是可能的。 CMPXCHG 也很慢。 我用过的所有 SIMD 架构都有这样的指令。以上是关于快速的寄存器内字节?的主要内容,如果未能解决你的问题,请参考以下文章