【问题标题】:GPU programming model - how many simultaneous, divergent threads without penaltyGPU 编程模型 - 有多少同时发散的线程而不会受到惩罚
【发布时间】:2017-04-15 08:28:36
【问题描述】:

我是 GPGPU 和 CUDA 的新手。根据我的阅读,在当前一代的 CUDA GPU 上,线程被捆绑成 32 个线程的扭曲。 warp 中的所有线程都执行相同的指令,因此如果分支中存在分歧,则所有线程基本上花费的时间与采用所有发生的分支相对应。然而,似乎在 GPU 上同时执行的不同 warp 可以有不同的分支而没有此成本,因为不同的 warp 是由不同的计算资源执行的。所以我的问题是,在分歧不会导致这种惩罚的情况下,可以执行多少并发扭曲......即我应该在规格表中寻找多少数量。与此处相关的是“着色器处理器”的数量还是“流式多处理器”的数量?

另外,AMD Radeon 也有同样的问题:这里的相关术语可能是“统一着色器”和“计算单元”。

最后,假设我的工作负载在线程之间存在很大差异,所以我基本上只希望每个 warp 有一个线程。本质上将 GPU 用作普通的多核 CPU。这有可能吗?我应该如何布置线程和线程块才能发生这种情况?我可以避免为warp中的31个冗余线程分配内存等吗?我意识到这可能不是 GPGPU 的理想工作负载,但它可以用于在后台运行活动而不会阻塞主机 CPU。

【问题讨论】:

    标签: gpgpu


    【解决方案1】:

    我是 GPGPU 的新手,我正在学习 OpenCL。但是这个问题几个月来一直没有答案,所以我会尝试一下(如果我错了,希望专家能纠正我)。

    然而,在 GPU 上同时执行的不同 warp 似乎可以有不同的分支而无需此成本,因为不同的 warp 由不同的计算资源执行

    不一定。在 AMD 系统上,在任何给定时间都只处理 64 个工作项(在 CUDA 中称为线程)(技术上:AMD 系统中的每个 VALU 一次处理 16 个项,但任何给定指令每次重复四次。所以每个“AMD Wavefront”有 64 个项目)。在 NVidia 系统上,似乎每个 warp 一次执行 32 个线程。

    当然,“块大小”可能远大于 64。因此,如果您使用 32x32 像素块,则每个工作组 (OpenCL) 或 Warp 需要 1024 个内核/着色器/工作项。

    在 NVidia Pascal 下,这 1024 个线程可以发散而不会受到惩罚,因为它们被分成 32 个一组。


    因此,如果您的工作组/扭曲大小为 1024,与 32x32 像素块相关...前两行将在一个 VALU (AMD GCN) 或 SM (NVidia Pascal) 上执行。只要所有这 32 个线程/64 个工作项都采用相同的分支,您就不会受到任何惩罚。

    最后,假设我的工作负载在线程之间存在很大差异,所以我基本上只希望每个 warp 有一个线程。本质上将 GPU 用作普通的多核 CPU。这可能吗?我应该如何布置线程和线程块以实现这种情况?我可以避免为warp中的31个冗余线程分配内存等吗?我意识到这可能不是 GPGPU 的理想工作负载,但它可以用于在后台运行活动而不会阻塞主机 CPU。

    if( threadid> 0) {
    } else {
        dostuff();
    }
    

    老实说,我认为最好的做法是让你分道扬镳并抱有最好的希望。所有这些核心都有自己的资源(寄存器等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多