我是 CUDA 的新手,我对内核调用感到困惑。
当您调用内核方法时,您需要指定块数和每个块的线程数,例如 kernelMethod<<< block, Threads >>>(parameters);"
那么为什么可以使用第三个参数呢?kernelMethod<<< 块,线程,???>>>(参数);
使用 cudaDeviceProp,您可以在变量 maxThreadsPerBlock 中读取每个块的线程数。但是我怎么知道最大块数呢?谢谢!!
第三个参数指定要动态分配的每个块的共享内存量。所述节目指南提供了有关的附加细节的共享存储器,以及一个描述和例子。
共享内存可以在内核中静态分配:
__shared__ int myints[256];
Run Code Online (Sandbox Code Playgroud)
或动态:
extern __shared__ int myints[];
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,有必要将要分配的共享内存的大小(以字节为单位)作为附加的内核配置参数(您提到的第三个参数)传递。
在这种情况下,指针myints然后指向该动态分配区域的开头。
每个网格维度 (x, y, z) 指定的最大块数也可以通过设备属性查询获得。它在maxGridSize 参数中指定。您可能需要参考deviceQuery 示例以获取工作示例。