h_uat
h_uat

Reputation: 55

nvcc problems compiling object oriented code due to missing class template

I have an issue with compiling CUDA code using nvcc. To demonstrate it I created a dummy class to represent a surface in 3D space.

Here goes the file 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

And here is the corresponding surface.cpp file:

#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;
}

I am trying to compile it with nvcc -x cu -arch=sm_50 -I. -dc surface.cpp -o surface.o but get the following errors:

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".

I really don't get the reason for this error because in my opinion the class is fully defined and the argument list should be known to the compiler. Did any of you already experience a similar issue? If I remove the __device__ and __host__ flags and compile it with gcc everything works fine.

nvcc --version output:

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

I am aware that CUDA does not necessarily support every single feature of object oriented programming but double-checked that the stuff I am trying to compile here should be compatible.

I appreciate every hint :). Thanks a lot in advance.

Upvotes: 0

Views: 206

Answers (1)

h_uat
h_uat

Reputation: 55

The only problem with this code was that surface is already a built-in type of cuda.h resulting in this problem. After renaming it everything runs through without error.

Upvotes: 1

Related Questions