2012-06-23 107 views
1

當我想使用推力和C++的時候,我遇到了很大的編譯問題。如何編譯推力和C++項目?

下面是項目結構(只是一個測試項目):

sortbase.h

#include<iostream> 
#include <thrust/device_vector.h> 
using namespace std; 

template<class T> 
class SortBase 
{ 
public: 
     void Init() 
     { 
     } 
     void resize(const int &x) 
     { 
       CV.resize(x); 
       cout<<"resize succeed!"<<endl; 
     } 
private: 
     thrust::device_vector<T> CV; 
}; 

sorter.h

#ifndef __SORTER_H__ 
#define __SORTER_H__ 
#include <iostream> 
#include <thrust/device_vector.h> 
#include "sortbase.h" 
using namespace std; 

template<class T> 
void ttest() 
{cout<<"tttttttttttttttt";cout<<endl;} 
     template<class KEY> 
     class Sorter 
     { 
     public: 
       Sorter():CV(NULL) 
       { 
         CV=new SortBase<KEY>(); 
       } 
       ~Sorter() 
       { 
         if (CV!=NULL) 
         { 
           delete CV; 
           CV=NULL; 
         } 
       } 
       __host__ __device__ 
       virtual bool operator()(const KEY& x,const KEY& y)const 
       { 
         return (x<y); 
       } 
       void test() 
       { 
         //ttest<KEY>(); 
         resize(5); 
       } 
     private: 
       void resize(const int &x) 
       { 
         CV->resize(x); 
         cout<<"resize: "<<x<<endl; 
       } 
     private: 
       SortBase<KEY> *CV; 
     }; 

#endif 

的main.cpp

#include <iostream> 
#include "include/sorter.cu" 
using namespace std; 

int main(int argc,char **argv) 
{ 
     Sorter<int> *sorter=new Sorter<int>(); 
     sorter->test(); 
     return 0; 
} 

我做的是這樣的:

nvcc -c sorter.cu 
g++ -c main.cpp -I/usr/local/cuda/include 
g++ sorter.o main.o -o sorter 

但第二步給出了錯誤信息,很多警告和錯誤消息。 誰能幫幫我? 像這樣的一些警告和錯誤消息:

/usr/local/cuda/include/thrust/detail/device/cuda/for_each.inl: In function \u2018RandomAccessIterator thrust::detail::device::cuda::for_each_n(RandomAccessIterator, Size, UnaryFunction) [with RandomAccessIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, UnaryFunction = thrust::detail::generate_functor<thrust::detail::fill_functor<int> >]\u2019: 
/usr/local/cuda/include/thrust/detail/device/dispatch/for_each.h:56: instantiated from \u2018RandomAccessIterator thrust::detail::device::dispatch::for_each_n(RandomAccessIterator, Size, UnaryFunction, thrust::detail::cuda_device_space_tag) [with RandomAccessIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, UnaryFunction = thrust::detail::generate_functor<thrust::detail::fill_functor<int> >]\u2019 
/usr/local/cuda/include/thrust/detail/device/for_each.inl:43: instantiated from \u2018OutputIterator thrust::detail::device::for_each_n(OutputIterator, Size, UnaryFunction) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, UnaryFunction = thrust::detail::generate_functor<thrust::detail::fill_functor<int> >]\u2019 
/usr/local/cuda/include/thrust/detail/dispatch/for_each.h:84: instantiated from \u2018OutputIterator thrust::detail::dispatch::for_each_n(OutputIterator, Size, UnaryFunction, thrust::device_space_tag) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, UnaryFunction = thrust::detail::generate_functor<thrust::detail::fill_functor<int> >]\u2019 
/usr/local/cuda/include/thrust/detail/for_each.inl:41: instantiated from \u2018OutputIterator thrust::detail::for_each_n(OutputIterator, Size, UnaryFunction) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, UnaryFunction = thrust::detail::generate_functor<thrust::detail::fill_functor<int> >]\u2019 
/usr/local/cuda/include/thrust/detail/generate.inl:47: instantiated from \u2018OutputIterator thrust::generate_n(OutputIterator, Size, Generator) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, Generator = thrust::detail::fill_functor<int>]\u2019 
/usr/local/cuda/include/thrust/detail/device/cuda/fill.inl:87: instantiated from \u2018OutputIterator thrust::detail::device::cuda::detail::fill_n(OutputIterator, Size, const T&, thrust::detail::false_type) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, T = int]\u2019 
/usr/local/cuda/include/thrust/detail/device/cuda/fill.inl:117: instantiated from \u2018OutputIterator thrust::detail::device::cuda::detail::fill_n(OutputIterator, Size, const T&, thrust::detail::true_type) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, T = int]\u2019 
/usr/local/cuda/include/thrust/detail/device/cuda/fill.inl:138: instantiated from \u2018OutputIterator thrust::detail::device::cuda::fill_n(OutputIterator, Size, const T&) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, T = int]\u2019 
/usr/local/cuda/include/thrust/detail/device/dispatch/fill.h:57: instantiated from \u2018OutputIterator thrust::detail::device::dispatch::fill_n(OutputIterator, Size, const T&, thrust::detail::cuda_device_space_tag) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, T = int]\u2019 
/usr/local/cuda/include/thrust/detail/device/fill.inl:47: instantiated from \u2018OutputIterator thrust::detail::device::fill_n(OutputIterator, Size, const T&) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, T = int]\u2019 
/usr/local/cuda/include/thrust/detail/dispatch/fill.h:76: instantiated from \u2018OutputIterator thrust::detail::dispatch::fill_n(OutputIterator, Size, const T&, thrust::device_space_tag) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, T = int]\u2019 
/usr/local/cuda/include/thrust/detail/fill.inl:46: instantiated from \u2018OutputIterator thrust::fill_n(OutputIterator, Size, const T&) [with OutputIterator = thrust::detail::normal_iterator<thrust::device_ptr<int> >, Size = long unsigned int, T = int]\u2019 
/usr/local/cuda/include/thrust/detail/vector_base.inl:757: instantiated from \u2018void thrust::detail::vector_base<T, Alloc>::fill_insert(typename thrust::detail::contiguous_storage<T, Alloc>::iterator, typename thrust::detail::contiguous_storage<T, Alloc>::size_type, const T&) [with T = int, Alloc = thrust::device_malloc_allocator<int>]\u2019 
/usr/local/cuda/include/thrust/detail/vector_base.inl:561: instantiated from \u2018void thrust::detail::vector_base<T, Alloc>::insert(typename thrust::detail::contiguous_storage<T, Alloc>::iterator, typename thrust::detail::contiguous_storage<T, Alloc>::size_type, const T&) [with T = int, Alloc = thrust::device_malloc_allocator<int>]\u2019 
/usr/local/cuda/include/thrust/detail/vector_base.inl:223: instantiated from \u2018void thrust::detail::vector_base<T, Alloc>::resize(typename thrust::detail::contiguous_storage<T, Alloc>::size_type, typename thrust::detail::contiguous_storage<T, Alloc>::value_type) [with T = int, Alloc = thrust::device_malloc_allocator<int>]\u2019 

include/sortbase.h:14: instantiated from void SortBase<T>::resize(const int&) [with T = int] 
include/sorter.cu:40: instantiated from void Sorter<KEY>::resize(const int&) [with KEY = int] 
include/sorter.cu:35: instantiated from void Sorter<KEY>::test() [with KEY = int] 
main.cpp:9: instantiated from here 
/usr/local/cuda/include/thrust/detail/device/cuda/for_each.inl:93: error: invalid  application of sizeof to incomplete type thrust::detail::STATIC_ASSERTION_FAILURE<false> 
/usr/local/cuda/include/thrust/detail/device/cuda/arch.h: At global scope: 
/usr/local/cuda/include/thrust/detail/device/cuda/arch.h:59: warning: inline function size_t thrust::detail::device::cuda::arch::compute_capability() used but never defined 
+2

** **什麼錯誤訊息? –

+0

您是否使用CUDA安裝目錄的推力? – geek

+0

一些實例化錯誤,如下所示:/usr/local/cuda/include/thrust/detail/device/cuda/for_each.inl:93:錯誤:無效的應用程序sizeof –

回答

4

我覺得現在的問題是要包括從.cpp文件的文件.CU。推力代碼只能從.cu文件中使用,必須由NVCC編譯,而不是由主編譯器g ++編譯。因此,您需要將所有Thrust和CUDA設備代碼移入可從.cpp文件調用的函數中.cu文件。

+0

謝謝@harrism,這個問題解決了,我犯了一個愚蠢的錯誤。 –

+0

很高興你解決了它。請接受我的答案,如果它解決了您的問題,或者如果解決方案是別的,請提供另一個答案。 – harrism

0

Harrism是對的。如果你要編譯使用GPU的文件時,你必須使用.cu的文件和nvcc像:

nvcc -o test test.cu