如何使用 "as much dynamic shared mem as is possible" 启动内核?
How can I launch a kernel with "as much dynamic shared mem as is possible"?
我们知道 CUDA 设备的共享内存容量非常有限,只有几十千字节。我们也知道内核不会启动(通常?永远?)如果你要求太多的共享内存。我们还知道可用的共享内存既被您使用的代码中的静态分配使用,也被动态分配的共享内存使用。
现在,cudaGetDeviceProperties()
为我们提供了总体 space。但是,给定一个函数符号,是否可以确定它将使用多少静态分配的共享内存,以便我可以 "fill up" 共享内存在启动时达到最大容量?如果没有,是否有可能让 CUDA 以某种方式为我处理这个问题?
运行时 API 具有当前上下文中任何内核的功能 cudaFuncGetAttributes which will allow you to retrieve the attributes,包括内核将消耗的每个块的静态共享内存量。您可以使用这些信息自行计算。
您还可以使用 nvcc 编译信息来获取共享内存的静态分配
我们知道 CUDA 设备的共享内存容量非常有限,只有几十千字节。我们也知道内核不会启动(通常?永远?)如果你要求太多的共享内存。我们还知道可用的共享内存既被您使用的代码中的静态分配使用,也被动态分配的共享内存使用。
现在,cudaGetDeviceProperties()
为我们提供了总体 space。但是,给定一个函数符号,是否可以确定它将使用多少静态分配的共享内存,以便我可以 "fill up" 共享内存在启动时达到最大容量?如果没有,是否有可能让 CUDA 以某种方式为我处理这个问题?
运行时 API 具有当前上下文中任何内核的功能 cudaFuncGetAttributes which will allow you to retrieve the attributes,包括内核将消耗的每个块的静态共享内存量。您可以使用这些信息自行计算。
您还可以使用 nvcc 编译信息来获取共享内存的静态分配