我想使用接受带有内核模板的 CUDA 内核函数指针的 CUDA 运行时 API 函数。
我可以在没有模板的情况下执行以下操作:
__global__ myKernel()
{
...
}
void myFunc(const char* kernel_ptr)
{
...
// use API functions like
cudaFuncGetAttributes(&attrib, kernel_ptr);
...
}
int main()
{
myFunc(myKernel);
}
但是,当内核是模板时,上述方法不起作用。
另一个例子:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
template<typename T>
__global__ void addKernel(T *c, const T *a, const T *b)
{
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
int main()
{
cudaFuncAttributes attrib;
cudaError_t err;
//OK:
err = cudaFuncGetAttributes(&attrib, addKernel<float>); // works fine
printf("result: %s, reg1: %d\n", cudaGetErrorString(err), attrib.numRegs);
//NOT OK:
//try to get function ptr to pass as an argument:
const char* ptr = addKernel<float>; // compile error
err = cudaFuncGetAttributes(&attrib, ptr);
printf("result: %s, reg2: %d\n", cudaGetErrorString(err), attrib.numRegs);
}
以上导致编译错误:
错误:没有函数模板“addKernel”的实例与所需类型匹配
编辑:到目前为止,我发现的唯一解决方法是将 myFunc 中的内容(参见第一个代码示例)放入一个宏中,这很丑陋,但它不需要传递指针参数并且工作正常:
#define MY_FUNC(kernel) \
{ \
...\
cudaFuncGetAttributes( &attrib, kernel ); \
...\
}
用法:
MY_FUNC( myKernel<float> )