【问题标题】:CUDA: Only one job to begin withCUDA:一开始只有一份工作
【发布时间】:2011-10-19 13:29:21
【问题描述】:

抱歉标题不好。我想不出更好的办法。

我看到的每个 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;
        }
    }
}

【问题讨论】:

    标签: parallel-processing gpgpu cuda


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我会尝试以这种方式看待它。希望它会起作用。
    【解决方案2】:

    看来您可以使用CUDA Dynamic Parallelism

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

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多