因此,看起来您确实有一个奇怪的
#include
,导致代码被错误的编译器编译。通过使用.cu.h作为cuda头文件的标识,区分gpu头文件和cpu头文件。确保只有NVCC编译.cu和.cu.h文件。Cuda文件不应包含在cpp文件中。内核和内核调用应在.cu或.cu.h文件中,并且这些文件不应在cpps中任何地方包含。
由于您的.cu正在被包含在由主机编译器编译的标头中,因此主机编译器最终会命中标记<<< - 它无法识别。它可能确实理解标记<<,因此它消耗了那个标记,留下一个意外的<。
以下是另一种应该有效的方法(我没有尝试过,但它类似于我们使用的代码)
(注意,这可能有效,但也可能不是解决问题的正确方法。我的老板不喜欢它作为解决方案,而更喜欢添加每个变化的实现)
根本问题似乎是主机代码和设备代码之间缺乏区别。在我的解决方案中,我将在类型和实现细节上对Matrix.h进行模板化。
我将在类型和实现细节上对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上执行以下操作:
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);
...
}
}
当我们从主机代码中使用矩阵时,我们在主机上对模板进行求和实现,不需要看到任何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,m2,result);
如果我们正在使用GPU,我们可以使用加速的GPU实现sum:
#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);
希望这对您有用!
<T>
和<<<
之间放置一个空格,以防将它们一起运行导致解析问题。 - Rup