同步和 cuda 可扩展性

synchronization and cuda scalability

我读到 CUDA 阻止来自不同块的线程之间的同步以允许可扩展性。即使增加设备中的 MP 数量会提高执行速度,线程是在同一个块中同步还是在不同块之间同步,这是怎么回事?

至少有两个相关的事情需要考虑。

  1. 可扩展性 是双向的,向上 向下。希望您的 CUDA 程序能够 运行 在不同于 "designed" 的 GPU 上。这意味着它可能 运行ning 在更大的 GPU 或更小的 GPU 上。假设我有 128 个线程块(可能来自一个更大的程序)之间的同步要求,所有线程块都必须同时执行才能交换数据并满足同步要求,然后才能完成。如果我 运行 这个程序在一个有 16 个 SM 的 GPU 上运行,每个 SM 最多可以调度 16 个线程块,那么可以合理地得出这个程序 可能 工作的结论,因为GPU 是 256 个线程块。但是如果我运行GPU上的程序有4个SM,每个SM可以调度16个threadblock,就没有程序可以正常完成的情况。

  2. CUDA 调度 会(在某种程度上)干扰所需的程序执行。没有保证或指定 CUDA 调度程序可以调度线程块的顺序。因此,扩展上面的例子,假设一个 8 SM GPU(128 个线程块瞬时容量),可能是我的 128 个关键线程块中的 127 个被调度,而同时其他非同步关键线程块被调度。 127 个关键线程块将占用 128 个可用线程块中的 127 个 "slots",只留下 1 个槽来处理其他线程块。 127 个关键线程块很可能处于空闲状态,等待线程块 128 出现,消耗插槽但不一定做有用的工作。这将使GPU的性能下降到很低的水平,直到第128个线程块最终被调度。

这些是在 CUDA 程序的设计中不希望有线程块间同步要求的原因的一些例子。