GPU编程模型 - 没有惩罚的同时发散线程数

时间:2017-04-15 08:28:36

标签: gpgpu

我是GPGPU和CUDA的新手。根据我的阅读,在当前的CUDA GPU上,线程被捆绑到32个线程的warp中。 warp中的所有线程执行相同的指令,因此如果分支中存在分歧,则所有线程基本上花费相应于获取所有生成的分支的时间。然而,似乎在GPU上同时执行的不同warp可以具有不同成本的分支分支,因为不同的warp由单独的计算资源执行。所以我的问题是,有多少并发warp可以如此执行,其中分歧不会导致这种恶意......即,我应该在规格表中找到多少个数字。它是"着色器处理器的数量"或者#34;流式多处理器的数量"这是相关的吗?

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

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

1 个答案:

答案 0 :(得分:0)

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

  

然而,似乎在GPU上同时执行的不同warp可以有不同的分支而没有这个成本,因为不同的warp由不同的计算资源执行

不一定。在AMD系统上,在任何给定时间只处理64个工作项(在CUDA中称为线程)(技术上:AMD系统中的每个VALU一次处理16个项目,但任何给定的指令每次重复四次。因此每个“AMD Wavefront”有64个项目。在NVidia系统上,似乎每个warp一次执行32个线程。

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

这些1024个线程在NVidia Pascal下可以分散而不会受到惩罚,因为它们被分成32组。

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

  

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

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

老实说,如果你只是分歧并希望最好,我认为这是最好的。所有这些核心都有自己的资源(注册表和东西)。