CUDA:开始时只有一份工作

时间:2011-10-19 13:29:21

标签: parallel-processing gpgpu cuda

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

我见过的每个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;
        }
    }
}

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

好像你可以使用CUDA Dynamic Parallelism

有了这个,你可以调用另一个内核中的内核,这意味着,当第一个内核结束时,并且在完成之前完成生成10个任务,你可以调用下一个将处理这些任务的内核。