2014-11-06 71 views
5

我想分析一些我在网上找到的代码,并且不断思考自己到了一个角落。我正在看一个直方图内核推出与以下参数了解此CUDA内核启动参数

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

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

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

另外,在内核本身内部有__syncthreads()的调用,那么在内核调用的过程中,有没有2500组调用__syncthreads()

+2

第一个问题:是的。第二个问题:这些2500块内的线程独立于其他块中的线程,将进入'__syncthreads()'点,直到块中的所有线程完成对共享内存的更新直到该点到达,并且然后继续执行更多指令。块内的所有线程都必须看到'__syncthreads()',所以你可以说有'2500个'numBins'对'__syncthreads()'*的调用,但它与通常的函数调用不同。这是块内线程同步的屏障程序。 – Farzad 2014-11-06 06:31:03

回答

4

那么这意味有numBins线程每2500块, 每个块还具有提供给它的线程 共享存储器numBins *的sizeof(无符号整数)块?

CUDA Toolkit documentation

执行配置(一个全局函数调用的)是通过插入的形式<<<Dg,Db,Ns,S>>>,其中的表达式来指定:

  • Dg的为dim3 )指定网格的尺寸和大小。
  • Db的为dim3)指定的每个块
  • Ns个为size_t)的尺寸和大小指定了动态地分配每块该呼叫在共享存储器的字节数除了静态分配的内存。
  • 小号cudaStream_t)指定相关的数据流,是一个可选参数缺省值为0

所以,作为@Fazar指出,答案是肯定的。该内存按块分配。

此外,内核中有到__syncthreads()调用,是 有那么2500套numBins的在 当然,内核调用的调用__syncthreads()?

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

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