GPGPU中的分歧分歧、GPGPU

2023-09-03 08:49:49 作者:毛爷爷↘快到兜里来

我知道,在出现分歧的情况下,IF和ELSE都是在GPU上为每个工作项执行的,最后在掩码的帮助下我们选择了其中一个。但我不能理解,如果我们两个都被执行了,那么它怎么会增加执行单元的空闲。

我已经讨论了一些关于堆栈溢出的问题,但它们与堆栈溢出如何影响执行单元的空闲无关。

899元自卫反击 HD4830史上最全面测试

有人能给我解释清楚这个概念吗?分歧如何增加执行单元中的停滞或空闲?

推荐答案

在执行两个代码路径以选择一个结果后,不使用掩码,但在执行期间使用不同的掩码,以便仅启用在当前执行的代码路径中处于活动状态的当前Warp内的线程。

让我们看一个8宽SIMD单元的小示例(实际的GPU SIMD单元是32(Nvidia)或64-op(AMD GCN)宽):

if ((threadIdx.x % 2) == 0)   
{
   a = b+c;   // Even threads
} else
   a = b*c;   // Odd threads
}
d = a*2

这将被执行为:

if ((threadIdx.x % 2) == 0) // MASK: 11111111 all threads enabled

a = b+c; // MASK: 10101010, only even threads enabled, odd threads idle

a = b*c; // MASK: 01010101, only odd threads enabled, even threads idle

d = a*2 // MASK: 11111111, all threads are enabled again

第4行之所以称为"恢复点",是因为在第1行拆分的控制流在这里合并。在2号线和3号线中,只有一半的执行单元被使用,其他执行单元保持空闲。因此,在执行这些行的过程中,GPU的性能会减半。