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)
您将需要使用多个内核调用.一旦内核作业完成并为其子项生成工作单元,子项就可以在另一个内核中执行.你不想在cuda内核中使用while循环进行轮询,即使它起作用你也会得到糟糕的性能.
我会google CUDA并行缩减示例.演示如何分解为多个内核.唯一的区别是,不会在内核之间做更少的工作,而是会做得更多.
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |