c++ - 调用模板CUDA内核时的C++ 问题

  显示原文与译文双语对照的内容

我试图创建模板内核,但是在我的程序中调用它们时遇到了一些麻烦。 我有一个 Matrix<T> 模板类,并且在它里面定义了一些方法

Matrix.h:


template <typename T> class Matrix {


. . .


 void sum(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum);


. . .


}



#include"Matrix.cu"



Matrix.cu:


#include"MatrixKernel.h"



template<typename T> void Matrix<T>::sum(const Matrix<T>& m, Matrix<T>& sum) {


. . .


 sumKernel<T><<<dimGrid, dimBlock>>>(Matrix<T> m1, Matrix<T> m2, Matrix<T> sum)


. . .


}



MatrixKernel.h:


template<typename T> __global__ void sumKernel(const Matrix<T> m1, const Matrix<T> m2, Matrix<T> sum) {


...


}



问题是当我从sum内部调用sumKernel时,编译器会给我以下错误:


error C2059: syntax error : '<'



有人知道发生了什么? 在我包括sumKernel调用之前,代码编译好了。

谢谢。

时间: 原作者:

因此,看起来你确实有一个奇怪的#include,导致代码被错误的编译器编译。 在. cu. 头部使用h 来区分gpu头部和cpu头。 确保只有 NVCC编译 .cu.cu.h 文件。 conf文件永远不应包含在cpp文件中。 内核和内核调用应该在 .cu 或者 .cu.h 文件中,并且这些文件不应该包含在cpps的任何地方。

由于 .cu 正在被主机编译器编译的标头包含,主机编译器结束了令牌 <<< 。 它可能理解了令牌 <<,因此它使用了这个,留下了一个意外的<

这里是一种做事的替代方法( 不应该尝试它但是它与我们使用的代码相似)

注意,这可能是有效的,但它也可能不是解决问题的正确方法。 老板不喜欢它作为解决方案,更愿意在每个变化中添加一个实现) 。

底层问题似乎缺少主机和设备代码之间的区别。 我将把细节放在解决方案中,例如将结果复制到设备。总和实现等等。

我想解决的问题是,如果一个构造,你如何模板它以使用主机和设备。

我将在类型和实现细节上对 Matrix.h 进行模板。


 template <typename T, typename Implementation<T>> class Matrix {


 void sum(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)


 {


 Implementation.sumImp(m1, m2, sum);


 }


 }



主机实现,HostMatrixSum.h 将在cpu上执行以下操作:


 #include"Matrix.h"



 template <typename T> struct HostMatrixSum


 {


 void sumImp(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)


 {


. . .


 }


 }



GpuMatrixSum.cu.h 将上载矩阵,请执行求和并恢复结果:


 #include"Matrix.h"



 template <typename T> struct GpuMatrixSum


 { 


 template<typename T> __global__ void sumKernel(const Matrix<T> m1, const Matrix<T> m2, Matrix<T> sum)


 {


. . .


 }



 void sumImp(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)


 {


. . .


 sumKernel<T> < <<dimGrid, dimBlock>> > (m1,m2);


. . .


 }


 }



然后,在主机代码的模板上使用矩阵来实现主机和实现,并且不需要看到任何ipqos细节:


 #include"Matrix.h"


 #include"HostMatrixSum.h"



 Matrix<int, HostMatrixSum> m1 = Matrix<int>(...);


 Matrix<int, HostMatrixSum> m2 = Matrix<int>(...);


 Matrix<int, HostMatrixSum> result;


 Matrix.sum(m1,m2,result);



如果我们正在使用 gpu,我们可以使用加速gpu实现和:


 #include"Matrix.h"


 #include"GpuMatrixSum.cu.h"



 Matrix<int, GpuMatrixSum> m1 = Matrix<int>(...);


 Matrix<int, GpuMatrixSum> m2 = Matrix<int>(...);


 Matrix<int, GpuMatrixSum> result;


 Matrix.sum(m1,m2,result);



希望对你有用 !

...