2017-04-15 44 views
0

我是GPGPU和CUDA的新手。从我的阅读中,在当代CUDA GPU上,线程被捆绑成32个线程的变形。变形中的所有线程都执行相同的指令,所以如果分支中存在分歧,所有线程基本上都花费相应的时间来获取所有发生的分支。然而,似乎在GPU上同时执行的不同warps可以具有不同的分支而没有这个成本,因为不同的warp是由单独的计算资源执行的。所以我的问题是,在发散不会导致这种情感的情况下,可以如此执行多少个并发变形...即,我应该在规格表中查找哪个编号。 “着色器处理器”的数量还是与此处相关的“流式多处理器”的数量?GPU编程模型 - 多少个同时发散的线程无惩罚

此外,AMD Radeon的相同问题:这里的相关术语可能是“统一着色器”和“计算单位”。

最后,假设我有一个跨线程高度分歧的工作负载,所以我基本上只想每个线程有一个线程。基本上使用GPU作为普通的多核CPU。这是可能的,我应该如何布置线程和线程块才能发生?我可以避免为warp中的31个冗余线程分配内存等。我意识到这可能不是GPGPU的理想工作负载,但它可用于在后台运行活动而不会阻塞主机CPU。

回答

0

我是GPGPU新手,而不是学习OpenCL。但这个问题几个月来一直没有答案,所以我会刺伤它(如果我错了,希望有专家会纠正我)。

然而,似乎是因为不同的经纱是由不同的计算资源

不一定执行在GPU上同时执行不同的经线可以有不同的分支没有这笔费用。在AMD系统中,任何时候只有64个工作项目(称为CUDA中的线程)在工作(技术上说:AMD系统中的每个VALU一次处理16个项目,但每次给定指令重复四次。所以每个“AMD Wavefront”64个项目)。在NVidia系统上,似乎每个warp每次执行32个线程。

当然,“块大小”可能远远大于64.因此,如果您在做32x32像素块,则每个工作组(OpenCL)或Warp需要1024个核心/着色器/工作项。

这些螺纹1024能发散,而不对NVIDIA帕斯卡尔惩罚,因为他们分成套32


所以,如果你有1024个工作组/ warp大小,关联到的32×32块像素...前两行将在一个VALU(AMD GCN)或SM(NVidia Pascal)上执行。只要所有这32个线程/ 64个工作项目采用相同的分支,就不会有任何处罚。

最后,假设我有一个跨线程高度分歧的工作负载,所以我基本上只想每个warp有一个线程。基本上使用GPU作为普通的多核CPU。这是可能的,我应该如何布置线程和线程块才能发生?我可以避免为warp中的31个冗余线程分配内存等。我意识到这可能不是GPGPU的理想工作负载,但它可用于在后台运行活动而不会阻塞主机CPU。

if(threadid> 0) { 
} else { 
    dostuff(); 
} 

老实说,我认为最好的,如果你只是分歧,希望最好的。所有这些内核都有自己的资源(寄存器和内容)。