5

我在 cuda 中编写了一个应用程序,它在每个块中使用 1kb 的共享内存。由于每个 SM 中只有 16kb 的共享内存,所以总共只能容纳 16 个块(我理解正确吗?),虽然一次只能调度 8 个,但是现在如果某个块忙于做内存操作,所以其他块将被调度到 gpu 上,但是所有共享内存都被其他 16 个块使用,这些块已经在那里调度,所以 cuda 不会在同一个 sm 上调度更多块,除非之前分配的块完全完成?或者它将某些块的共享内存移动到全局内存,并在那里分配其他块(在这种情况下,我们应该担心全局内存访问延迟吗?)

4

1 回答 1

7

它不是那样工作的。在单个 SM 上的任何给定时刻计划运行的块数将始终为以下各项中的最小值:

  1. 8块
  2. 静态和动态分配的共享内存之和小于 16kb 或 48kb 的块数,具体取决于 GPU 架构和设置。还有共享内存页面大小限制,这意味着每个块分配被四舍五入到页面大小的下一个最大倍数
  3. 根据架构,每个块寄存器使用量之和小于 8192/16384/32678 的块数。还有寄存器文件页面大小,这意味着每个块分配被四舍五入到页面大小的下一个最大倍数。

这就是它的全部。没有共享内存的“分页”来容纳更多块。NVIDIA 生成了一个用于计算占用率的电子表格,该电子表格随工具包一起提供,可单独下载。您可以在它包含的公式中看到确切的规则。它们也在 CUDA 编程指南的第 4.2 节中进行了讨论。

于 2011-04-10T11:35:46.827 回答