我们知道 CUDA 设备的共享内存容量非常有限,只有几十千字节。而且我们也知道如果您要求太多共享内存,内核将不会启动(通常?曾经?)。而且我们还知道,您使用的代码中的静态分配和动态分配的共享内存都使用了可用的共享内存。
现在,cudaGetDeviceProperties()
给了我们我们所拥有的整体空间。但是,给定一个函数符号,是否可以确定它将使用多少静态分配的共享内存,以便我可以在启动时将共享内存“填满”到最大容量?如果没有,是否有可能让 CUDA 以某种方式为我处理这个问题?
我们知道 CUDA 设备的共享内存容量非常有限,只有几十千字节。而且我们也知道如果您要求太多共享内存,内核将不会启动(通常?曾经?)。而且我们还知道,您使用的代码中的静态分配和动态分配的共享内存都使用了可用的共享内存。
现在,cudaGetDeviceProperties()
给了我们我们所拥有的整体空间。但是,给定一个函数符号,是否可以确定它将使用多少静态分配的共享内存,以便我可以在启动时将共享内存“填满”到最大容量?如果没有,是否有可能让 CUDA 以某种方式为我处理这个问题?
运行时 API 有一个cudaFuncGetAttributes函数,它允许您检索当前上下文中任何内核的属性,包括内核将消耗的每个块的静态共享内存量。你可以用这些信息自己做数学。
您还可以使用 nvcc 编译信息来获取共享内存的静态分配