I’m trying to implement an expression template library in CUDA language.
I have a CudaMatrix.h file, included in the main program, that contains:
template <typename OutType> class CudaMatrix { // some stuff template <class A,class T> const CudaMatrix<OutType> & operator=(CudaExpr<A,T> e) { evaluation_function(data_,e,GetNumElements()); return *this; } }; I have also a CudaMatrix.cu file that contains:
#include "CudaExpression.cuh" // Contains the unary and binary operation classes template <class A, class T1, class T2> __global__ inline void evaluation(T1 *data_, const CudaExpr<A,T2> e, int NumElements) { const int i = blockDim.x * blockIdx.x + threadIdx.x; if(i < NumElements) data_[i] = e[i]; } template<class A, class T1, class T2> inline void eval_wrap(T1 *data_, const CudaExpr<A,T2> e, int NumElements) { dim3 dimGrid(iDivUp(NumElements,dimBlock.x)); evaluation<<<dimGrid,dimBlock>>>(data_,ob,NumElements); } template<class A, class T1, class T2> void evaluation_function(T1* data, const CudaExpr<A,T2> e, int NumElements) { eval_wrap(data, e, NumElements); }; I have chosen this organization since I’m moving to the .cu file all the device code that must compiled by nvcc and elsewhere the host code that must be compiled by the Visual Studio 2010 compiler. When I compile, I unfortunately have the following problem:
Error 35 error LNK2019: unresolved external symbol "void __cdecl evaluation_function<class CudaBinExpr<struct double2 const *,struct double2 const *,class CudaOpSum,struct double2>,struct double2,struct double2>(struct double2 *,class CudaExpr<class CudaBinExpr<struct double2 const *,struct double2 const *,class CudaOpSum,struct double2>,struct double2>,int)" (??$evaluation_function@V $CudaBinExpr@PBUdouble2@@PBU1@VCudaOpSum@@U1@@@Udouble2@@U2@@@YAXPAUdouble2@@V $CudaExpr@V?$CudaBinExpr@PBUdouble2@@PBU1@VCudaOpSum@@U1@@@Udouble2@@@@H@Z) referenced in function "public: class CudaMatrix<struct double2> const & __thiscall CudaMatrix<struct double2>::operator=<class CudaBinExpr<struct double2 const *,struct double2 const *,class CudaOpSum,struct double2>,struct double2>(class CudaExpr<class CudaBinExpr<struct double2 const *,struct double2 const *,class CudaOpSum,struct double2>,struct double2>)" (??$?4V $CudaBinExpr@PBUdouble2@@PBU1@VCudaOpSum@@U1@@@Udouble2@@@ $CudaMatrix@Udouble2@@@@QAEABV0@V?$CudaExpr@V $CudaBinExpr@PBUdouble2@@PBU1@VCudaOpSum@@U1@@@Udouble2@@@@@Z) Could anyone help me? Thank you very much in advance.