C 对64个元素的网络交换进行排序
我试图在一个C程序中使用它来排序一个小列表C 对64个元素的网络交换进行排序,c,sorting,swap,sorting-network,C,Sorting,Swap,Sorting Network,我试图在一个C程序中使用它来排序一个小列表a,其中包含n元素。排序网络由SWAP(x,y)宏组成,每个宏比较两个元素A[x]和A[y],必要时进行交换。这将生成用于排序的SWAP(x,y)宏序列n这与移动循环数组有关(接近#3 in) 有确定序列的算法,即Bose Nelson算法(),C实现在中,这与移动圆形数组有关(方法#3 in) 有一些算法可以确定序列,即Bose Nelson算法(),C实现在中。如果有人(我)对排序网络对于32位整数的64个元素序列有多合适的问题感兴趣,我自己刚刚看了
a
,其中包含n
元素。排序网络由SWAP(x,y)
宏组成,每个宏比较两个元素A[x]
和A[y]
,必要时进行交换。这将生成用于排序的SWAP(x,y)
宏序列n这与移动循环数组有关(接近#3 in)
有确定序列的算法,即Bose Nelson算法(),C实现在中,这与移动圆形数组有关(方法#3 in)
有一些算法可以确定序列,即Bose Nelson算法(),C实现在中。如果有人(我)对排序网络对于32位整数的64个元素序列有多合适的问题感兴趣,我自己刚刚看了一下,发现了以下几点:
- qsort每个序列大约需要2600ns
- std::sort每个序列大约花费1100纳秒
- Bose-Nelson分拣网络每个序列大约需要1200纳秒
- 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奇偶网络使用了我自己的实现和基准代码,对于Bose Nelson网络,。如果有人(我)对排序网络对于32位整数的64个元素序列有多合适这个问题感兴趣,我自己刚刚看了一下,发现了以下内容:
- qsort每个序列大约需要2600ns
- std::sort每个序列大约花费1100纳秒
- Bose-Nelson分拣网络每个序列大约需要1200纳秒
- 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奇偶网络使用了我自己的实现和基准代码,对于Bose Nelson网络,Bose Nelson分拣网络生成器可满足我的要求。然而,我后来发现Batcher奇偶合并排序wiki中的也生成了我正在寻找的SWAP(x,y)
序列。Batcher网络的交换(x,y)
数量低于Bose Nelson网络(至少对于n=64
,543
vs665
)。Bose Nelson分拣网络生成器适用于我的目的。然而,我后来发现Batcher奇偶合并排序wiki中的也生成了我正在寻找的SWAP(x,y)
序列。Batcher网络的交换(x,y)
数量低于Bose Nelson网络(至少对于n=64
,543
vs665
)。