启动内核时共享内存和流

use*_*674 2 c cuda gpu gpu-shared-memory

我是 CUDA 新手,正在从事个人项目。我知道,如果您想在启动时指定共享内存量:

kernel<<<grid_size,block_size,shared_mem_size>>>(parameters);
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我想将内核放入流中:

kernel<<<grid_size,block_size,0,stream_being_used>>>(parameters);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第三个参数在流的情况下是0?(我是从 Sanders 和 Kandrot 的《CUDA 示例》第 10 章中得到的)。

如果我想在启动时指定共享内存并将其放入流中,我该如何正确执行此操作?换句话说,中间的参数应该<<<...>>>是什么样的?

Rob*_*lla 5

存在 0 的唯一原因是因为在该特定示例中不需要动态共享内存。

共享内存可以静态分配(不使用 using,extern在这种情况下,大小在声明中明确说明)或动态分配(使用extern,并且大小显示为内核启动配置中的第三个参数)。

内核启动配置参数<<<...>>>始终以相同的顺序显示:

  1. 网格尺寸
  2. 螺纹块尺寸
  3. 动态分配的共享内存的大小(以字节为单位
  4. 启动内核的流

1和2是强制的,3和4是可选的。但如果您需要指定参数 4(流),则必须提供参数 3,即使它为零。

所以正确的顺序是:

kernel_name<<<grid_dim, threadblock_dim, dynamic_shared_memory_size, stream>>>(...);
Run Code Online (Sandbox Code Playgroud)

您可以在文档中阅读更多相关信息