【问题标题】:Sorting Network SWAPs for 64 elements为 64 个元素排序网络交换
【发布时间】:2020-05-22 04:21:16
【问题描述】:

我正在尝试在 C 程序中使用 Sorting NetworkAn 元素的小列表进行排序。排序网络由SWAP(x, y) 宏组成,每个宏都比较两个元素A[x]A[y],并在必要时进行交换。这个website 生成SWAP(x, y) 宏序列,用于对n <= 32 元素进行排序。

现在,我正在寻找用于对 n = 64 元素进行排序的 SWAP(x, y) 序列。在这一点上,我不确定 Sorting Network 是否会比对 n = 64 元素使用其他排序算法更快,但我希望对其进行测试。我的问题是:有没有列出这个序列的网站/论文/项目?或者是否有任何算法可以从 n <= 32 的排序网络中为 n = 64 生成?

谢谢。

【问题讨论】:

    标签: c sorting swap sorting-network


    【解决方案1】:

    如果有人对排序网络对 32 位整数的 64 个元素序列的适用性问题感兴趣(我曾经),我自己看了一眼,发现以下内容:

    • qsort 每个序列大约需要 2600ns
    • std::sort 每个序列大约需要 1100 ns
    • Bose-Nelson 排序网络每个序列大约需要 1200 ns
    • Batcher 奇偶网络每个序列大约需要 850ns
    • 使用 AVX2 指令同时处理 8 个序列的 Batcher 奇偶网络每个序列耗时 70ns

    序列是统一生成的,因此熵最大,即最坏情况,有利于排序网络。

    您可能期望使用 AVX2 理论上可以实现 8 倍的加速,为什么会有 12 倍的加速?查看程序集,Clang 以如下块执行排序网络的多次交换:

    00007FF6DA081374  vpminsd     ymm4,ymm0,ymm1  
    00007FF6DA081379  vpmaxsd     ymm0,ymm0,ymm1  
    00007FF6DA08137E  vpminsd     ymm1,ymm2,ymm3  
    00007FF6DA081383  vpmaxsd     ymm2,ymm2,ymm3  
    00007FF6DA081388  vpminsd     ymm3,ymm4,ymm1  
    00007FF6DA08138D  vpmaxsd     ymm1,ymm4,ymm1  
    00007FF6DA081392  vpminsd     ymm4,ymm0,ymm2  
    00007FF6DA081397  vpmaxsd     ymm0,ymm0,ymm2  
    00007FF6DA08139C  vpminsd     ymm2,ymm4,ymm1  
    00007FF6DA0813A1  vpmaxsd     ymm1,ymm4,ymm1 
    

    而标量代码使用 cmp、cmovgt、cmovlt 指令,这些指令也与 mov 和来自内存的指令混合在一起。随心所欲。

    我使用自己的实现和基准测试代码用于 Batcher 奇数/偶数网络,地址为 https://github.com/jamesthomasgriffin/sorting_networks,对于 Bose-Nelson 网络,https://github.com/Vectorized/Static-Sort

    【讨论】:

      【解决方案2】:

      这与移动一个圆形数组有关(https://leetcode.com/articles/rotate-array/# 中的方法 #3)

      有确定序列的算法,即 Bose-Nelson 算法 (https://metacpan.org/pod/Algorithm::Networksort),C 实现在 https://github.com/atinm/bose-nelson/blob/master/bose-nelson.c

      【讨论】:

      • Bose-Nelson 排序网络生成器符合我的目的。但是,我后来发现 Batcher 奇偶合并排序 wiki 中的 example-code 也生成了我正在寻找的 SWAP(x, y) 序列。 Batcher 网络的SWAP(x, y) 数量低于 Bose-Nelson 网络(至少对于 n=64543665 而言)。
      猜你喜欢
      • 2014-10-17
      • 1970-01-01
      • 2018-01-09
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 2011-11-29
      相关资源
      最近更新 更多