CUDA:开始时只有一份工作

Mad*_*sen 0 parallel-processing cuda gpgpu

抱歉标题不好.我无法想出更好的东西.

我见过的每个CUDA程序示例都有预定义的数据,可以并行化.一个常见的例子是两个矩阵的总和,其中两个矩阵已经被填充.但是那些产生新任务的程序又如何呢?我如何在CUDA中建模?如何传递结果,以便其他线程可以开始处理它.

例如:假设我在一个作业上运行内核.这项工作产生了10个新的独立工作.他们每个人都会产生10个新的独立工作,依此类推.这似乎是一项高度并行的任务,因为每项工作都是独立的.问题是我不知道如何在CUDA中对此进行建模.我已经尝试在CUDA中进行它,我在内核中使用了一个while循环来保持轮询,如果一个线程可以开始计算.每个线程都分配了一个作业.但那没用.它似乎忽略了while循环.

代码示例:

On host:
fill ready array with 0
ready[0] = 1;

On device:
__global__ void kernel(int *ready, int *result)
{
    int tid = threadIdx.x;
    if(tid < N)
    {
        int condition = ready[tid];
        while(condition != 1)
        {
            condition = ready[tid];
        }

        result[tid] = 3;// later do real computation

        //children jobs is now ready to work
        int childIndex = tid * 10;
        if(childIndex < (N-10))
        {
            ready[childIndex + 1] = 1; ready[childIndex + 2] = 1;
            ready[childIndex + 3] = 1; ready[childIndex + 4] = 1;
            ready[childIndex + 5] = 1; ready[childIndex + 6] = 1;
            ready[childIndex + 7] = 1; ready[childIndex + 8] = 1;
            ready[childIndex + 9] = 1; ready[childIndex +10] = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

oni*_*nit 8

您将需要使用多个内核调用.一旦内核作业完成并为其子项生成工作单元,子项就可以在另一个内核中执行.你不想在cuda内核中使用while循环进行轮询,即使它起作用你也会得到糟糕的性能.

我会google CUDA并行缩减示例.演示如何分解为多个内核.唯一的区别是,不会在内核之间做更少的工作,而是会做得更多.