【问题标题】:What is the real amount of shared memory for block on sm13?sm13 上块的实际共享内存量是多少?
【发布时间】:2013-12-22 14:02:49
【问题描述】:

参考wiki/CUDA

  • 每个多处理器 8 的最大驻留块数
  • 每个多处理器的最大共享内存量 16 KB

这是否意味着,如果我有很多运行块,它们中的每一个都只能有 2 KB 的共享内存?如果不是这样并且每个块仍然有 16KB 共享内存,那么当 2 个 16KB 内存的块在 signle MP 上执行时,它是否存储?

【问题讨论】:

  • 请停下来。在 24 小时内提出 8 个问题,其中大部分问题可以通过阅读 CUDA 编程指南中的几页来回答,这几乎是滥用 Stack Overflow
  • @talonmies,对不起,我真的找不到它直到现在..
  • 看起来 Nvidia 已经从文档中删除了与 cc

标签: cuda


【解决方案1】:

在多处理器上运行的所有块必须共享所有资源(寄存器、共享内存等)

如果你的线程块使用共享内存,它必须满足的第一条规则是它不能使用超过 SM 中可用的内存(即在这种情况下为 16KB)。

如果线程块需要小于 16KB,则可能有多个线程块在 SM 上执行。例如,如果每个线程块仅使用大约 8KB,则可能正在执行两个线程块。如果每个线程块最多使用(略小于)4KB(通常会有一些开销),则可以执行四个线程块。

如果您希望最多 8 个线程块能够在给定的 SM(多处理器)上一次执行,那么您必须在代码中确保线程块使用不超过 2KB 的共享内存(可能有点小于 2KB)。

如果每个线程块使用 16KB 的共享内存,这仅仅意味着额外的线程块将在队列中等待,直到该线程块在该 SM 上完成,然后才开始执行。

如果线程块尝试使用超过 16KB(在这种情况下),您将收到内核启动错误。

【讨论】:

  • 我猜,如果可用的话,最好每次在 SM 上拥有 8 个块(可以在内核中进行 while 循环并用其他 2KB 数据块重新填充共享内存)?还是没有区别?
  • 一般来说,在一个 SM 上执行更多的线程块可能会提高性能(这与 occupancy 有关)。但这是一个概括,并非在所有情况下都是如此。更多的线程块通常可以提供更多可用(准备执行)的扭曲。拥有更多可用的 warp 意味着在一个或多个 warp 停止的情况下(可能等待读取数据),SM 更有可能做有用的工作。
猜你喜欢
  • 1970-01-01
  • 2016-10-26
  • 2017-02-20
  • 2014-02-14
  • 2017-10-25
  • 2016-08-11
  • 2017-05-10
  • 2016-06-08
  • 1970-01-01
相关资源
最近更新 更多