我知道,一般来说,不能直接从.cpp文件中调用CUDA内核。相反,如果需要这样的功能,内核必须包装在一个CPU可调用的函数中,该函数的接口进入.h文件,其实现与内核一起进入.cu文件。
但是,如果内核在其类型中被模板化并且希望通过CPU包装器将该模板化性传递给.cpp文件(因为模板接口必须在同一文件中(。 h)作为其实现,因此导致任何非nvcc编译器尝试访问该.h文件的问题。)
有没有人知道解决这个限制的方法?也许没有,可以证明(完全模板化的)CUDA Thrust库只能直接从.cu文件(see here)调用?
答案 0 :(得分:3)
你是对的。内核模板总是必须在.cu
文件中实例化。
对于足够简单的模板函数(例如,只有一个类型参数),重载函数有时可以满足您的需求。或者您也可以为.cpp
文件创建另一个模板。
kernel.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); }
的main.cpp
#include "axpy.h"
...
{
axpy(xx,yy,length);
cpp_axpy<double>(xxx,yyy,lll);
}
...