multithreading - CUDA:关于事件扭曲(事件 block )以及如何选择 block 大小的问题

标签 multithreading cuda

假设一个 CUDA GPU 可以在一个多处理器上同时有 48 个事件扭曲,即一个扭曲的 48 个 block ,或者 2 个扭曲的 24 个 block ,...,因为来自多个 block 的所有事件扭曲都被安排执行,看起来大小块的大小对于GPU的占用并不重要(当然应该是32的倍数),32、64、128都没有区别吧?那么 block 的大小只是由计算任务和资源限制(共享内存或寄存器)决定的吗?

最佳答案

您忽略了多个值得考虑的因素。

  • SM 上的事件 block 数是有限制的。当前限制为 8(所有设备),因此如果您想实现完全占用,您的 block 不应小于:3-warps(设备 1.0、1.1)、4-warps(1.2、1.3)和 6-warps (2.x)
  • 根据设备的不同,每个多处理器有 8K、16K 或 32K 寄存器可用。 block 越大, block 需要多少寄存器的“粒度”就越大。对于大街区,如果不能完全入住,你会损失很多。对于较小的 block ,损失可能更小。这就是为什么我个人更喜欢 2x256 而不是 1x512。
  • 如果您确实需要在一个 block 中的扭曲之间进行同步,那么更大的 block 可以让您拥有更广泛的同步。
  • 保证在单个多处理器上调度单个 block 。如果它的所有扭曲都有一些公共(public)数据(例如控制变量),您可以减少全局内存获取的数量。另一方面,当您创建大量小块时,每个小块可能都需要分别加载相同的数据。在有一些缓存的 Fermi 上,它不如在 GF-200 系列上重要。但是请记住,由于有这么多多处理器,1MB L2 缓存仍然非常非常小!
  • 关于multithreading - CUDA:关于事件扭曲(事件 block )以及如何选择 block 大小的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5378598/

    相关文章:

    c++ - std::call_once 对非原子变量安全吗?

    c - 消息发送 : Invalid argument

    c - 在不逐行修改原始代码的情况下将C代码移植到CUDA

    c++ - 填充 CUDA 内核中的数组或列表,但不是在每个线程中

    内核启动的 CudaEvent 时序

    c++ - C++ 中的线程池是什么,它是如何实现的?

    Python:线程管理其他线程通知的事件

    java - 在静态变量中使用同步

    c++ - 使用 Cmake 编写简单的 CUDA 程序

    c++ - 通过单独的类将数组指针传输到 CUDA 内存中