调用模板CUDA内核时出现问题
Problem when calling template CUDA kernel
我一直在尝试创建模板内核,但在程序中调用它们时遇到了一些问题。我有一个Matrix<T>
模板类,其中定义了一些方法
矩阵.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
,导致代码被错误的编译器编译。通过对cuda标头使用.cu.h来区分gpu标头和cpu标头。确保仅NVCC编译.cu
和.cu.h
文件。Cuda文件不应包含在cpp文件中。内核和内核调用应该在.cu
或.cu.h
文件中,并且这些文件不应该包含在cpp中的任何位置。
因为.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);
...
}
}
然后,当我们使用主机代码中的矩阵时,我们在主机和实现上使用模板,而不需要看到任何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上工作,我们可以使用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,m2,result);
希望对你有用!
我遇到了同样的问题:错误C2059:语法错误:'<'
首先,我在这里找到了一个很好的设置/教程(适用于visualexpression2010和cuda4.0):http://www.stevenmarkford.com/installing-nvidia-cuda-with-visual-studio-2010/
并且为了解决语法错误问题,这解决了它:如何在Visual Studio 2010中启动CUDA应用程序?
具体来说,更改*.cu文件的属性,使:Type设置为"CUDA C/C++"
终于为我工作了。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 内核调用会产生错误"error: a host function call cannot be configured"。调用有什么问题?
- 从静态初始化代码启动CUDA内核时遇到问题
- c++微内核计数问题
- 调用模板CUDA内核时出现问题