调用模板CUDA内核时出现问题

问题描述

| 我一直在尝试创建模板内核,但是在程序中调用它们时遇到了一些麻烦。我有一个
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调用之前,该代码编译良好。 谢谢。     

解决方法

        因此,看来您确实有一个奇怪的ѭ5,导致代码被错误的编译器编译。通过使用.cu.h作为cuda头,可以区分gpu头和cpu头。确保仅NVCC编译
.cu
.cu.h
文件。 Cuda文件永远不应包含在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>& sum)
     {
         ...
     }
 }
尽管ѭ18将上载矩阵,但求和并恢复结果:
 #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>& sum)
     {
         ...
         sumKernel<T> <<< dimGrid,dimBlock >>> (m1,m2);
         ...
     }
 }
然后,当我们从主机代码中使用Matrix时,我们以主机总和实现为模板,而无需查看任何cuda细节:
 #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,result);
如果我们正在研究gpu,则可以使用sum的加速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,result);
希望对您有用!     ,        我有同样的问题:错误C2059:语法错误:\'<\' 首先,我在这里找到了一个不错的设置/教程(适用于Visual Express 2010和cuda 4.0): http://www.stevenmarkford.com/installing-nvidia-cuda-with-visual-studio-2010/ 并解决语法错误问题,这解决了它: 如何在Visual Studio 2010中启动CUDA应用程序? 具体来说,更改* .cu文件的属性,使得:类型设置为\“ CUDA C / C ++ \” 终于为我工作了。