我是CUDA的新手,我对内核调用感到困惑。
当您调用内核方法时,您可以指定块数和每个块的线程,例如此kernelMethod<<< block,Threads>>>(参数);“
那么为什么可以使用第三个参数呢? kernelMethod<<< block,Threads,???>>>(参数);
使用cudaDeviceProp,您可以读取变量maxThreadsPerBlock中每个块的线程数。但是我怎么知道最大块数? 谢谢!
答案 0 :(得分:4)
第三个参数指定要动态分配的每个块的共享内存量。 programming guide提供了有关shared memory以及description and example的其他详细信息。
共享内存可以在内核中静态分配:
__shared__ int myints[256];
或动态:
extern __shared__ int myints[];
在后一种情况下,有必要作为额外的内核配置参数(您提到的第三个参数)传递要以字节为单位分配的共享内存的 size 。
在那种情况下,指针myints
然后指向该动态分配区域的开头。
每个网格尺寸(x,y,z)指定最大块数,也可以通过设备属性query获取。它在maxGridSize parameter中指定。您可能需要参考deviceQuery sample以获得有用的示例。