CUDAOccupancyMappotentialBlockSize API模板用法

CUDAOccupancyMappotentialBlockSize API模板用法,cuda,Cuda,我试图理解CUDA占用API cudaOccupancyMaxPotentialBlockSize 模板化版本定义如下 template<class T> __inline__ __host__ CUDART_DEVICE cudaError_t cudaOccupancyMaxPotentialBlockSize( int *minGridSize, int *blockSize, T func, size_t dynamicSMemSize = 0,

我试图理解CUDA占用API cudaOccupancyMaxPotentialBlockSize

模板化版本定义如下

template<class T>
__inline__ __host__ CUDART_DEVICE cudaError_t 
cudaOccupancyMaxPotentialBlockSize(
int    *minGridSize,
int    *blockSize,
T       func,
size_t  dynamicSMemSize = 0,
int     blockSizeLimit = 0)
{
return cudaOccupancyMaxPotentialBlockSizeVariableSMem(minGridSize, blockSize, func, __cudaOccupancyB2DHelper(dynamicSMemSize), blockSizeLimit);
} 
模板
__内联存储主机存储设备存储错误
cudaOccupancyMaxPotentialBlockSize(
int*minGridSize,
int*块大小,
T func,
大小\u t dynamicSMemSize=0,
int blockSizeLimit=0)
{
返回cudaOccupancyMaxPotentialBlockSizeVariableSMem(minGridSize、blockSize、func、u cudaOccupancyB2DHelper(dynamicSMemSize)、blockSizeLimit);
} 
如果内核是一个模板,我还没有找到多少关于如何使用API的例子

我在我们的代码中找到了一个,如下面的示例所示

template <typename T> __global__ void fn(T *a) { *a = 10;}

cudaOccupancyMaxPotentialBlockSize<void(*)(int *)>(&gridSize, &blockSize, fn, 0, 0); 
template\uuuu global\uuuuu void fn(T*a){*a=10;}
cudaOccupancyMaxPotentialBlockSize(&gridSize,&blockSize,fn,0,0);
在本例中,这个void*(int*)表示(内核的)函数指针,该指针将void和int作为参数返回。我的理解正确吗

如果是这样,由于内核的返回类型始终为void,那么模板列表中的第一个参数是否始终为void,然后其他参数(如int*)根据参数列表跟随


有谁能更好地解释(用例子)如何在内核为模板的情况下使用这个API吗

void(*)(int)
是常规的C(++)函数指针语法,因此是的,它将始终是
void(*)(Args…
。或者,您可以将模板参数放在函数指针本身,让参数推断接管:
cudaOccupancyMaxPotentialBlockSize(&gridSize,&blockSize,&fn,0,0)

@IGarFieldl感谢您的回复。因此,理想情况下,在API中使用此模板内核的两种方法是CUDAOCCUPancyMappotentialBlockSize(&gridSize,&blockSize,fn,0,0)和CUDAOCCUPancyMappotentialBlockSize(&gridSize,&blockSize,&fn,0,0)。正确吗?去掉类型别名,这是唯一的两种方法,是的。谢谢你的回答。