Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对64个元素的网络交换进行排序_C_Sorting_Swap_Sorting Network - Fatal编程技术网

C 对64个元素的网络交换进行排序

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个元素序列有多合适的问题感兴趣,我自己刚刚看了

我试图在一个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个元素序列有多合适的问题感兴趣,我自己刚刚看了一下,发现了以下几点:

  • 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
vs
665
)。Bose Nelson分拣网络生成器适用于我的目的。然而,我后来发现Batcher奇偶合并排序wiki中的也生成了我正在寻找的
SWAP(x,y)
序列。Batcher网络的
交换(x,y)
数量低于Bose Nelson网络(至少对于
n=64
543
vs
665
)。