cuda - 在 GPU 编程中使用条件时,工作项执行什么?

标签 cuda opencl gpgpu gpu

如果您在波前执行工作项并且有条件,例如:

  if(x){
        ...
  }
  else{
       ....
  }

工作项执行什么?波前中的所有工作项是否都将执行第一个分支(即 x == true )。如果没有 x 为假的工作项,则跳过其余的条件?

如果一个工作项采用替代路径会发生什么。我是否被告知所有工作项也将执行备用路径(因此执行两条路径?)。为什么会这样,怎么不打乱程序执行

最佳答案

NVIDIA GPU 使用条件执行来处理 SIMD 组内的分支分歧(“warp”)。在您的 if..else例如,两个分支都由发散扭曲中的每个线程执行,但那些不遵循给定分支的线程被标记并执行空操作。这是经典的分支发散惩罚 - interwarp 分支发散需要两次通过代码部分才能退出 warp。这并不理想,这就是面向性能的代码试图将其最小化的原因。经常引起人们注意的一件事是假设“首先”执行不同路径的哪一部分。由于在发散扭曲中再次猜测内部执行顺序,导致了一些非常微妙的错误。

对于更简单的条件,NVIDIA GPU 支持 ALU 处的条件评估,这不会导致发散,而对于整个扭曲遵循相同路径的条件,显然也没有惩罚。

关于cuda - 在 GPU 编程中使用条件时,工作项执行什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897454/

相关文章:

cuda - 全局写入中的内存合并

c++ - CUDA 似乎无法编译

cuda - ABI如何定义GPU中的寄存器数量?

cuda - 使用 CUDA 以编程方式找出 GPU 链接拓扑

python - PyOpenCl:如何调试段错误?

android - Opencl 在 ARM 上找不到 gpu

memory - 如何访问内核中的常量内存?

algorithm - 1 除以一个大整数

linux - 从 PCI 设备复制到 CUDA GPU 内存

c++ - cudaMemcpy 函数调用中的“cudaErrorUnknown”