OpenCL 中的工作项分支分歧,它是如何工作的?

问题描述 投票:0回答:1

我正在研究有关 OpenCL 的一些内容,但我不太理解“工作项发散或发散控制流”的概念。

如下图所示,存在一些扭曲或波前,具体取决于执行一条指令或另一条指令的 GPU 型号。

现在,我的问题是:所有的扭曲/波前将执行 if 条件,然后执行 else 条件,或者仅执行其中之一(仅 if 或仅 else)作为程序的正常控制流。

这个问题可能很愚蠢,但是在网上,我没有找到任何东西,并且通过其他材料,我不明白这一点。

gpu opencl nvidia amd-gpu thread-divergence
1个回答
2
投票

理解 GPU 式 SIMD 执行模型的关键是波前/SIMD 组中的所有线程 始终同时执行完全相同的指令。 如果一个线程不需要运行至少一个指令其他线程必须执行,不会有任何副作用(寄存器值不会改变等),但它在性能方面的成本仍然与真正运行它一样多。

如果波前/SIMD 组中的all 线程的分支条件为 true 或 false,则所有线程仅运行一个分支,而跳过另一个分支。因此,如果工作负载中几乎所有线程的条件都相同,或者您可以安排组中所有线程的条件相同,那么您就不需要支付分歧成本。 (或者它变得可以忽略不计。)

如果组内存在频繁发散,则整个波前需要执行两个分支。发生这种情况时,“不需要”实际运行代码的线程仍将与其他线程完全相同地单步执行其他线程所需的指令,只是没有任何效果。与硬件CPU线程不同,GPU线程不能运行与其他线程(在同一SIMD组中)不同的代码,它只能在不同的数据上运行相同的代码,或者必须等到其他线程完成它的代码不需要运行。

© www.soinside.com 2019 - 2024. All rights reserved.