cuda - gpgpu:为什么我们不需要细粒度多线程中的分支预测?

标签 cuda opencl gpgpu branch-prediction

当一个 wavefront 执行时,它提供了细粒度的多线程。这样做的后果之一是没有分支预测要求,如下面的幻灯片所示:

enter image description here

但是我无法理解这一点。有人可以用简单的方式解释一下吗?

最佳答案

分支会在指令流的执行中引入显着的延迟。如果处理器不支持推测执行,则在执行分支条件之前不允许执行任何指令。如果采用分支,则处理器需要获取新的指令行,从而引入额外的延迟。如果不采用分支,则可以继续执行。在深度管道上,条件的评估可以引入 10-20 个周期。分支预测和推测执行允许处理器继续执行附加指令或在分支发生时开始提前获取指令。如果分支预测不正确,则分支之后的所有指令都必须被丢弃(回滚)。

就面积而言,分支预测硬件通常很昂贵,但即使是基本的分支预测(可能采用与可能不采用)也可以显着提高 IPC。

至少出于 3 个原因,GPU 不倾向于实现分支预测:

  1. 分支预测的目标是通过推测执行指令而不是等待条件结果和可能的额外指令提取来改进 IPC。 GPU 旨在通过在多个执行线程之间免费切换来隐藏延迟。当 warp/wavefront 等待确定分支条件的结果时,可以发出其他 warp/wavefronts 来隐藏延迟。

  2. 分支历史表在面积方面很昂贵。

  3. 推测执行在面积方面是昂贵的。

关于cuda - gpgpu:为什么我们不需要细粒度多线程中的分支预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25474483/

相关文章:

cuda - 如何获取设备的GPU架构?

c++ - 使用 CMake 为 CUDA 构建多配置/多平台

java - Raycaster 不支持 OpenCL

pipe - OpenCL:增加管道参数的最大数量

lisp - CUDA 的任何 Lisp 扩展?

CUDA 动态并行性和 Biot-Savart 定律的涡分量计算

c - 我需要为 OpenCL 安装 Nvidia 的 SDK(CUDA) 来检测 Nvidia GPU 吗?

c++ - 如何提高此 OpenCL Reduction Kernel 代码的性能?

c++ - OpenCL:输出可变长度的数组

CUDA:总共有多少个并发线程?