opencl - 为什么 “if-else” 语句(在 GPU 代码中)会使性能减半

标签 opencl gpu gpgpu

我读了这篇文章:

FPGA or GPU? - The evolution continues

有人添加了一条评论,他在其中写道:

Since GPUs are SIMD any code with an “if-else” statement will cut your performance in half. Half of the cores will execute the if part of the statement while half of the cores are in idle and then the other half cores will do the else calculations while the first half of the cores remain idle.

我不明白为什么?

为什么在使用 if-else 时使用 GPU(即 OpenCL)性能会下降一半?

最佳答案

分支一般不会影响性能,但分支发散会影响性能。也就是说,两个线程采用不同的路径(例如,一个满足 if 条件,另一个则不满足)。由于 GPU 的所有线程都执行相同的“代码行”,因此某些线程必须等待执行不属于其路径的代码。
嗯,事实并非如此,因为只有一个扭曲 (NVIDIA) 或波前 (AMD) 中的所有线程都执行相同的“代码行”。 (目前,NVIDIA GPU的warp大小为32,AMD GPU的wafefront大小为64。)

因此,如果内核中有 if-else block ,最坏的情况确实是性能下降 50%。更糟糕的是:如果有 n 个可能的分支,则性能可能会下降到性能的 1/n 且没有发散(即扭曲中没有分支或所有线程/Wafefront 也走同样的道路)。当然,对于这种情况,您的整个内核必须嵌入到 if-else (或 switch)结构中。

但正如上面所写,只有当采用不同路径的线程位于相同的 warp/wafefront 时,才会发生这种情况。因此,您需要编写代码/重新排列数据/选择算法/...以尽可能避免分支发散。

Tl;DR:可以有分支,但如果不同的线程采用不同的分支,它们必须位于不同的 warp/wafefront 中,以避免发散,从而导致性能损失。

关于opencl - 为什么 “if-else” 语句(在 GPU 代码中)会使性能减半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45734138/

相关文章:

android - 某些 Android 设备上的低 fps

macos - Mac OSx 上的 OpenCL 内核错误

cuda - 是否可以直接从gpu访问硬盘?

python - pyopenCL,openCL,无法在GPU上构建程序

multithreading - 基于 GPU 的视频卡可加速您的程序计算,如何?

c++ - 用于加速器的 OpenMP 4.0 : Nvidia GPU target

c++ - 如何有效地将内核 malloc 数据返回给 cpu

OpenCL死锁可能性

c - OpenCL 在 code::blocks 中包括 cl.h on Windows

cuda - 从设备函数调用 Thrust device_vector