抱歉标题不好。我无法想出更好的东西。
我见过的每个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;
}
}
}
答案 0 :(得分:8)
您将需要使用多个内核调用。一旦内核作业完成并为其子项生成工作单元,子项就可以在另一个内核中执行。你不想在cuda内核中使用while循环进行轮询,即使它起作用你也会得到糟糕的性能。
我会谷歌CUDA并行缩减示例。演示如何分解为多个内核。唯一的区别是,不会在内核之间做更少的工作,而是会做得更多。
答案 1 :(得分:1)
好像你可以使用CUDA Dynamic Parallelism。
有了这个,你可以调用另一个内核中的内核,这意味着,当第一个内核结束时,并且在完成之前完成生成10个任务,你可以调用下一个将处理这些任务的内核。