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
Sorting 使用CUDA进行合并排序_Sorting_Cuda_Mergesort - Fatal编程技术网

Sorting 使用CUDA进行合并排序

Sorting 使用CUDA进行合并排序,sorting,cuda,mergesort,Sorting,Cuda,Mergesort,我尝试基于自底向上/迭代的Mergesort算法实现我自己的Mergesort。该算法将数据分为2个元素,并进行排序。然后按4个元素排序,依此类推,直到所有数据都排序。因此,我的计划是通过2个元素分配每个线程。所以我这样做: __global__ void mergeBU(int *d_a, int *d_aux, int sz, int N) { int idk = blockIdx.x*blockDim.x+threadIdx.x; int lo = 2 * sz *

我尝试基于自底向上/迭代的Mergesort算法实现我自己的Mergesort。该算法将数据分为2个元素,并进行排序。然后按4个元素排序,依此类推,直到所有数据都排序。因此,我的计划是通过2个元素分配每个线程。所以我这样做:

__global__ void mergeBU(int *d_a, int *d_aux, int sz, int N)
{
    int idk  = blockIdx.x*blockDim.x+threadIdx.x;
    int lo   = 2 * sz * idk;
    int mid  = lo + sz - 1;
    float hi = fminf(lo + sz + sz - 1, N - 1);
    merge(d_a, d_aux, lo, mid, hi); 
}

__device__ void merge(int *d_a, int *d_aux, int lo, int mid, float hi)
{
int i = lo;
int j = mid + 1;

    for (int k = lo; k <= hi; k++)
    {
      d_aux[k] = d_a[k];
    }

    for (int k = lo; k <= hi; k++)
    {
        if (i > mid)                    { d_a[k] = d_aux[j]; j++; }
        else if (j > hi)                { d_a[k] = d_aux[i]; i++; }
        else if (d_aux[j] < d_aux[i])   { d_a[k] = d_aux[j]; j++; }
       else                             { d_a[k] = d_aux[i]; i++; }
    }
}
\uuuu全局\uuuu无效合并(int*d\u a,int*d\u aux,int sz,int N)
{
int idk=blockIdx.x*blockDim.x+threadIdx.x;
int-lo=2*sz*idk;
int mid=lo+sz-1;
浮点数hi=fminf(lo+sz+sz-1,N-1);
合并(d_a、d_aux、lo、mid、hi);
}
__设备无效合并(int*d\U a、int*d\U aux、int lo、int mid、float hi)
{
int i=lo;
int j=mid+1;
对于(intk=lo;khi){dua[k]=duaux[i];i++}
如果(d_aux[j]

假设我调用我的内核(8个线程),所以我最多只能对16个元素进行排序。如果我输入32个元素,那么其余的数据索引就不会被触及(16-31)。如何使线程索引继续处理其余的数据索引?通过continues,我的意思是线程索引(0,1,2,3,4,5,6,7)继续处理其余的数据索引,它应该类似于threadindex(dataindex,dataindex)->0(16,17);1(18,19); 2(20,21); 等等欢迎发表任何评论

不看实际代码:合并排序是一种多过程算法。 因为在执行内核时,不同的块通常不同步(除非使用设备范围的原子),所以您应该考虑多个后续内核启动,每个通一个内核启动。例如,在第一次启动时,每个线程块对n_1个元素进行排序;第二次启动时,每对块合并2*n_1元素,依此类推。当然,这并不像听起来那么容易:你怎么知道哪个区块应该做什么呢


此外,您可能还想看看其他想法。

您的方法似乎是将大小为n的数组拆分为n/2子数组,合并这些子数组的对以n/4子数组结束,依此类推。然而,这种方法可能会受到内存带宽的限制

假设您选择使用8个“线程”。将数组拆分为8个子数组,每个子数组的大小为n/8(最后一个子数组的大小可能不同),然后使用8个线程合并排序子数组,然后使用4个线程合并4对排序子数组,然后使用2个线程合并2对合并子数组,然后使用1个线程合并最后2对


根据我在多线程排序方面的经验,cpu的内存带宽限制为8个线程,但是如果gpu的内存可以用来容纳阵列的大部分,那么8个线程以上可能是有益的。我不知道gpu及其内存中可以进行哪些操作(比较、移动等)。

我的坏先生,我的意思是,数组数据在第一次迭代时被2个元素分割,因此子数组的每个元素包含2个元素,然后对每个子数组排序,然后按4个元素排序,依此类推。我已经编辑了我的问题。你的建议似乎不错,但是线程有一个索引,如何分配每个线程来处理数据索引数组是我要处理的。因为线程是有限的,所以如果每个线程处理的元素数量固定,那么我的数据也会受到限制。@PriyanggaJanmantaraAnusasana-以2048的数组大小为例。在我使用8个线程的版本中,每个线程对256个元素进行合并排序,每个线程执行8个过程,每个过程创建大小为2、4、8、16、32、64、128、256的运行。然后,4个线程合并大小为256的运行对,以创建大小为512的4个运行。然后,两个线程合并大小为512的两个运行以创建大小为1024的两个运行。然后1个线程合并最后两对运行以创建1个大小为2048的运行。@PriyanggaJanmantaraAnusasana-继续,您建议运行1024个线程以创建大小为2的运行,然后运行512个线程以创建大小为4的运行,256个线程以创建大小为8的运行。。。等等线程将按顺序块运行,可能一次运行8或16个线程,但正如我在回答中提到的,典型PC上的内存带宽达到8个线程左右。