从.cpp文件调用模板化CUDA内核

时间:2013-10-15 17:08:58

标签: templates cuda

我知道,一般来说,不能直接从.cpp文件中调用CUDA内核。相反,如果需要这样的功能,内核必须包装在一个CPU可调用的函数中,该函数的接口进入.h文件,其实现与内核一起进入.cu文件。

但是,如果内核在其类型中被模板化并且希望通过CPU包装器将该模板化性传递给.cpp文件(因为模板接口必须在同一文件中(。 h)作为其实现,因此导致任何非nvcc编译器尝试访问该.h文件的问题。)

有没有人知道解决这个限制的方法?也许没有,可以证明(完全模板化的)CUDA Thrust库只能直接从.cu文件(see here)调用?

1 个答案:

答案 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);
}
...