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
Algorithm 使用二进制搜索的并行合并排序_Algorithm_Sorting_Merge_Cuda - Fatal编程技术网

Algorithm 使用二进制搜索的并行合并排序

Algorithm 使用二进制搜索的并行合并排序,algorithm,sorting,merge,cuda,Algorithm,Sorting,Merge,Cuda,我正在尝试在CUDA上实现合并排序算法,这在 对于中间级别,建议分配一个线程块,将两个排序的数组(例如a和B)合并到一个数组中。其思想是为数组a上的数据a_i分配一个线程,并使用二进制搜索在数组B上找到它的位置。如果a_i在B上的位置是j,那么a_i在新数组上的位置是(i+j) 但当我实现(或尝试实现)时,我发现上述方法似乎不起作用。例如,如果需要合并的两个数组如下所示 及 因此,第一个阵列上的53(灰色阴影)将发现其在第二个阵列上的各自位置为11,因此其在最终阵列上的位置为(11+11=2

我正在尝试在CUDA上实现合并排序算法,这在

对于中间级别,建议分配一个线程块,将两个排序的数组(例如a和B)合并到一个数组中。其思想是为数组a上的数据a_i分配一个线程,并使用二进制搜索在数组B上找到它的位置。如果a_i在B上的位置是j,那么a_i在新数组上的位置是(i+j)

但当我实现(或尝试实现)时,我发现上述方法似乎不起作用。例如,如果需要合并的两个数组如下所示

因此,第一个阵列上的53(灰色阴影)将发现其在第二个阵列上的各自位置为11,因此其在最终阵列上的位置为(11+11=22)。同样,在第一个用蓝色着色的阵列上,53的位置是(11+12=23)

如果我们取第二个数组的53,它的最终位置也是(11+11=22)。与第一个阵列上的灰色53冲突

所以根据我的理解,一个简单的二进制搜索算法不能用来合并这两个数组。有没有一种已知的或更简单的方法来解决这一冲突?

在这篇文章中,我读到:

给定排序后的序列A和B,我们要计算排序后的 顺序C=合并(A,B)。如果这些序列足够小, 如果每个元素的大小不大于t=256,我们可以合并它们 使用单个t形螺纹块。对于一个元素ai∈ A、 我们只需要 计算秩(ai,C),它是元素ai在 合并序列C。因为A和B都是排序的,所以我们知道 秩(ai,C)=i+秩(ai,B),其中秩(ai,B)只是 元素计数bj∈ B,bj
当你寻找等级(ai,B)时,你必须在二进制搜索中处理重复项。把B想象成一个BST,秩(ai,B)=j{bj的最大值对不起,我迟到了一点,但我只是尝试在FPGA上实现相同的算法


如果你只是使用好的,即使我们使用了它,当我们试图找到灰色53的最终位置时,如果蓝色53是其他值,它应该会工作吗?我们不会。让我们以数组A为例,例如A=78,73,63,53,53,…53。我们应该在A中与另一个ai发生冲突吗?不,因为秩(ai,C)=i+秩(ai,B),i实际上是ai在数组A中的位置。A中的每个53的i实际上是不同的。因此,对于常数秩(ai,B),不可能与其他ai发生冲突。此外,让我们取一个数组B,这样B=84,58,58,53,53,二进制搜索可以轻松确保秩(ai,B)在B中不是其他53。因此,秩(53,C)将没有其他秩(席席,C),席西在U b和Xi=53i中是指这样的例子,A=78、73、53、49、45和B=84、58、58、53、40。因此按秩(ai,b)函数,秩(53a,b)=3(其中,53a A是数组A的53),从而给出秩(53a,c)=2+3=5。同样,秩(53b b,a)=2给出秩(53b b,c)。=3+2=5。所以我们有一种情况,秩(53_a,C)=秩(53_B,C),它将每个数组a和数组B的53写入到C的第5个位置,这是一个冲突