你说的对。内核模板总是必须在.cu
文件中实例化。
对于足够简单的模板函数(例如,只有一个类型参数),重载函数有时可以满足您的需求。或者,您也可以为.cpp
文件创建另一个模板。
内核.cu
template <class T>
__global__ void kernel_axpy(T* x, T* y, int len) { ... }
void axpy(float* x, float* y, int len){ kernel_axpy<<<...>>>(x,y,len); }
void axpy(double* x, double* y, int len){ kernel_axpy<<<...>>>(x,y,len); }
axpy.h
extern void axpy(float* x, float* y, int len);
extern void axpy(double* x, double* y, int len);
template <class T> void cpp_axpy(T* x, T* y, int len) { std::cerr<<"Not implemented.\n"<<std::endl; }
template <> void cpp_axpy<float>(float* x, float* y, int len) { axpy(x,y,len); }
template <> void cpp_axpy<double>(double* x, double* y, int len) { axpy(x,y,len); }
主文件
#include "axpy.h"
...
{
axpy(xx,yy,length);
cpp_axpy<double>(xxx,yyy,lll);
}
...