【问题标题】:Understanding this CUDA kernels launch parameters了解这个 CUDA 内核启动参数
【发布时间】:2014-11-06 18:48:51
【问题描述】:

我正在尝试分析我在网上找到的一些代码,但我一直认为自己陷入了困境。我正在查看使用以下参数启动的直方图内核

histogram<<<2500, numBins, numBins * sizeof(unsigned int)>>>(...); 

我知道参数是网格、块、共享内存大小。

那么这是否意味着每个有 2500 个 numBins 线程块,每个块也有一个 numBins * sizeof(unsigned int) 块可供其线程使用的共享内存?

此外,在内核本身内部有对__syncthreads() 的调用,在内核调用过程中是否有2500 组numBins__syncthreads() 的调用?

【问题讨论】:

  • 第一个问题:是的。第二个问题:那些 2500 块内的线程,独立于其他块中的线程,将到达 __syncthreads() 点,一直停留到块中的所有线程完成对共享内存的更新并到达该点,然后继续执行进一步的指令。块内的所有线程都必须看到__syncthreads(),因此您可以说有2500 组numBins 调用__syncthreads(),但这与通常的函数调用不同。这是块内线程同步的屏障例程。

标签: cuda


【解决方案1】:

这是否意味着每个有 2500 个 numBins 线程块, 每个块也有一个 numBins * sizeof(unsigned int) 块 线程可用的共享内存?

来自CUDA Toolkit documentation

通过插入&lt;&lt;&lt;Dg,Db,Ns,S&gt;&gt;&gt; 形式的表达式来指定(全局函数调用的)执行配置,其中:

  • Dg (dim3) 指定网格的维度和大小。
  • Db (dim3) 指定每个块的维度和大小
  • Ns (size_t) 指定除了静态分配的内存之外,每个块为此调用动态分配的共享内存中的字节数。
  • S (cudaStream_t) 指定关联流,是可选参数,默认为0。

所以,正如@Fazar 指出的那样,答案是肯定的。这个内存是按块分配的。

此外,在内核本身内部也有对 __syncthreads() 的调用,它们是 然后有 2500 组 numBins 调用 __syncthreads() 在 内核调用过程?

__syncthreads() 一直等待,直到线程块中的所有线程都达到这一点。用于协调同一块中的线程之间的通信。

所以,每个块都有一个__syncthread() 调用。

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2012-08-23
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多