nvcc由于缺少类模板而无法编译面向对象的代码

时间:2019-12-27 10:30:49

标签: c++ oop cuda nvcc

我在使用nvcc编译CUDA代码时遇到问题。为了演示它,我创建了一个虚拟类来表示3D空间中的表面。

以下是文件surface.h

#ifndef SURFACE_H
#define SURFACE_H

class surface
{
private:
    float dX; // grid resolution in x [m]
    float   dY; // grid resolution in y [m]
    int nX; // number of elements in x
    int nY; // number of elements in y
    float* depth; // pointer to depth array [m]

public:
    __host__ __device__ void set_dim(const int _nX, const int _nY);
    __host__ __device__ void set_res(const float _dX, const float _dY);
    __host__ __device__ float get_surface_mm(const int iX, const int iY);
};

#endif

这是对应的surface.cpp文件:

#include "surface.h"

__host__ __device__ void surface::set_dim(const int _nX, const int _nY){
    nX = _nX;
    nY = _nY;
    return;
}

__host__ __device__ void surface::set_res(const float _dX, const float _dY){
    dX = _dX;
    dY = _dY;
    return;
}

__host__ __device__ float surface::get_surface_mm(const int iX, const int iY){
    float surfLvl = (float) iX * iY;
    return surfLvl;
}

我正在尝试使用nvcc -x cu -arch=sm_50 -I. -dc surface.cpp -o surface.o进行编译,但出现以下错误:

surface.h(4): error: argument list for class template "surface" is missing
surface.cpp(7): error: argument list for class template "surface" is missing
surface.cpp(8): error: identifier "nX" is undefined
surface.cpp(9): error: identifier "nY" is undefined
surface.cpp(13): error: argument list for class template "surface" is missing
surface.cpp(14): error: identifier "dX" is undefined
surface.cpp(15): error: identifier "dY" is undefined
surface.cpp(19): error: argument list for class template "surface" is missing
8 errors detected in the compilation of "/tmp/tmpxft_000bedf2_00000000-6_surface.cpp1.ii".

我真的不知道发生此错误的原因,因为我认为该类已完全定义,并且编译器应该知道参数列表。你们有没有遇到过类似的问题?如果删除__device____host__标志并用gcc进行编译,一切正常。

nvcc --version输出:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

我知道CUDA不一定支持面向对象编程的每一个功能,但仔细检查了我要在此处编译的内容是否兼容。

我很感谢每一个提示:)。提前谢谢。

1 个答案:

答案 0 :(得分:1)

此代码的唯一问题是surface已经是cuda.h的{​​{3}},导致了此问题。重命名后,一切都会正常进行。