开普勒CUDA动态并行和线程发散

时间:2012-07-09 06:46:08

标签: cuda kepler dynamic-parallelism

关于开普勒dynamic parallelism的信息非常少,从这项新技术的描述来看,它是否意味着解决同一经线中线程控制流分歧的问题?

它允许recursion和来自设备代码的午餐内核,是否意味着可以同时执行不同线程中的控制路径?

3 个答案:

答案 0 :(得分:3)

看看这个paper

动态并行性,流分歧和递归是分离的概念。动态并行性是在线程内启动线程的能力。这意味着你可以这样做

__global__ void t_father(...)   {
   ...
   t_child<<< BLOCKS, THREADS>>>();
   ...
}

我个人在这个领域进行了调查,当你做这样的事情时,当t_father启动t_child时,整个vga资源再次在那些中分发,并且t_father等待直到所有t_child完成才能继续(看起来也是这样) paper幻灯片25)

自Fermi以来可以使用递归,并且线程能够在没有任何其他线程/块重新配置的情况下调用自己的

关于流量偏差,我想我们永远不会在warp中看到同时执行不同代码的线程..

答案 1 :(得分:0)

没有。变形概念仍然存在。 warp中的所有线程都是SIMD(单指令多数据),这意味着它们同时运行一条指令。即使您调用子内核,GPU也会为您的调用指定一个或多个warp。当你使用动态并行时,你会想到3件事:

  1. 你能走的最深的是24(CC = 3.5)。

  2. 同时运行的动态内核数量有限(默认为4096),但可以增加。

  3. 在子内核调用之后保持父内核忙,否则很有可能浪费资源。

答案 2 :(得分:0)

幻灯片9中的NVidia presentation中有一个示例cuda源。

__global__ void convolution(int x[])
{
   for j = 1 to x[blockIdx]
      kernel<<< ... >>>(blockIdx, j)
}

接着展示了如何将部分CUDA控制代码移动到GPU,以便内核可以在各种大小的部分实际域上产生其他内核函数(幻灯片14)。

全局计算域及其分区仍然是静态的,因此您实际上无法将此DURING GPU计算更改为例如产生更多的内核执行因为你尚未达到评估函数的末尾。相反,您提供的数组包含您希望使用特定内核生成的线程数。