multithreading - GPU 上的线程和线程组

标签 multithreading gpu dispatch directcompute threadgroup

我想知道我可以在 GPU 上调度的线程/线程组的“网格”。我正在使用 Direct Compute,所以我将给出一个使用该 API 的具体示例。例如,如果我调用 Dispatch(2,2,2),我理解它总共分派(dispatch)了 2x2x2 = 8 个线程组。但是,如果我调用 Dispatch(8,1,1),它也调度 8x1x1 = 8 个线程组,有什么区别?有性能差异吗?

附言与 GPU 上的线程相同的问题。在计算 (.hlsl) 文件中声明的 numthreads(2,2,2) 和 numthreads(8,1,1) 有什么区别?

任何帮助,将不胜感激。

最佳答案

从纯粹的性能角度来看,实际上并没有区别,因为定义线程组或 block 的网格维度的能力更多是为了正确地将工作负载应用于问题本身的抽象,而不是为了性能.换句话说,如果您的问题很好地抽象为 3D 体积网格,那么虽然可以使用将 3D 问题转换为 1D 线性表示的映射来创建相同数量的线程组/ block ,但该映射的抽象处理起来可能有点麻烦。此外,如果映射过于复杂,可能会对性能造成很小的影响。

您创建的线程组/ block 的数量以及这些 block 中的线程数很重要。在 Nvidia GPU 的情况下,每个线程组都分配给 GPU 上的 SMX 处理器,并且需要将多个线程 block 及其关联线程映射到 SMX,以隐藏由于内存访问等导致的延迟。此外,您希望在线程组/ block 中有足够的线程来利用 GPU 的 SIMT(相同指令/多线程)功能。这意味着对于 Nvidia GPU 的 SMX 内的每个时钟周期(或一组时钟周期),它可以同步执行 X 个线程。这个数字称为“线经”尺寸。您希望 block 中有足够的线程来填充此扭曲计数,否则当 block 在 GPU 的各个 SMX 处理器上运行时,GPU 核心流处理器的资源不会被用完。这个数字是 Nvidia Fermi GPU 上的 32 个线程。在 CUDA 中,您可以根据您正在使用的 GPU 查询此信息,尽管我假设使用 DirectCompute 这将被抽象掉。 ATI 卡的流处理器也有一个“线程宽度”,即每个“波前”有 64 个线程。

理想情况下,最后你希望你的 block 中有足够的线程来填充 GPU 的波前或扭曲大小中的线程数,然后有很多 block 可以映射到 GPU 上的每个流处理器,这样它们每当遇到高延迟操作时,都可以在流处理器上保持运行并换出。这最大限度地提高了 GPU 的计算带宽。

关于multithreading - GPU 上的线程和线程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539724/

相关文章:

python - 同时使用多处理和线程的竞争条件

cuda - 在 CUDA 中模拟 std::bitset

c - 使用共享内存对三维数组的一维求和

ios - 如何在 ios 中停止 dispatch_queue?

cocoa :调度设计模式

r - 是否可以仅根据其位置指定的参数类来分派(dispatch) S3 方法?

处理 stdout 的并发问题

java - tomcat中的独立应用程序

android - 避免在屏幕旋转时终止并重新启动服务

c++ - 与 cusparse 相比,cublas 异常缓慢