ksm001
ksm001

Reputation: 4022

CUDA and Thrust library: Trouble with using .cuh .cu and .cpp files together with -std=c++0x

I want to have a .cuh file where I can declare kernel functions and host functions as well. The implementation of these functions will be made inside the .cu file. The implementation will include the use of the Thrust library.

In the main.cpp file I would like to use the implementation that is inside the .cu file. So let's say we have something like this:

myFunctions.cuh

#include <thrust/sort.h>
#include <thrust/device_vector.h>
#include <thrust/remove.h>
#include <thrust/host_vector.h>
#include <iostream>

__host__ void show();

myFunctions.cu

#include "myFunctions.cuh"

__host__ void show(){
   std::cout<<"test"<<std::endl;
}

main.cpp

#include "myFunctions.cuh"

int main(void){

    show();

    return 0;
}

If I compile by doing this:

nvcc myFunctions.cu main.cpp -O3

And then run the executable by typing ./a.out

The test text will be printed.

However, if I decide to include -std=c++0x by using the following command:

nvcc myFunctions.cu main.cpp -O3 --compiler-options "-std=c++0x"

I get a lot of errors, some of which are the following:

/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h(159): error: identifier "nullptr" is undefined

/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h(159): error: expected a ";"

/usr/include/c++/4.6/bits/exception_ptr.h(93): error: incomplete type is not allowed

/usr/include/c++/4.6/bits/exception_ptr.h(93): error: expected a ";"

/usr/include/c++/4.6/bits/exception_ptr.h(112): error: expected a ")"

/usr/include/c++/4.6/bits/exception_ptr.h(114): error: expected a ">"

/usr/include/c++/4.6/bits/exception_ptr.h(114): error: identifier "__o" is undefined

What do these errors mean and how can I avoid them?

Thank you in advance

Upvotes: 2

Views: 3610

Answers (1)

Robert Crovella
Robert Crovella

Reputation: 151879

If you look at this specific answer, you'll see the user is compiling an empty dummy app with the same switch you are using and getting some of the exact same errors. If you restrict the usage of that switch to compiling .cpp files, you'll probably have better results:

myFunctions.h:

void show();

myFunctions.cu:

#include <thrust/sort.h>
#include <thrust/device_vector.h>
#include <thrust/remove.h>
#include <thrust/host_vector.h>
#include <thrust/sequence.h>
#include <iostream>

#include "myFunctions.h"

void show(){
  thrust::device_vector<int> my_ints(10);
  thrust::sequence(my_ints.begin(), my_ints.end());
  std::cout<<"my_ints[9] = "<< my_ints[9] << std::endl;
}

main.cpp:

#include "myFunctions.h"

int main(void){

    show();

    return 0;
}

build:

g++ -c -std=c++0x main.cpp
nvcc -arch=sm_20 -c myFunctions.cu 
g++ -L/usr/local/cuda/lib64 -lcudart -o test main.o myFunctions.o

Upvotes: 5

Related Questions