c++ - 如何编译 thrust 和 c++ 项目?

标签 c++ compilation cuda thrust

当我想同时使用 thrust 和 c++ 时,我在编译时遇到了很大的问题。

这是项目结构(只是一个测试项目):

排序库.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;
};

排序器.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

但是第二步给出了错误信息,很多warning和error message。 谁能帮我? 一些像这样的警告和错误信息:

/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

最佳答案

我认为问题在于您从 .cpp 文件中包含了 .cu 文件。 Thrust 代码只能从 .cu 文件中使用,这些文件必须由 NVCC 编译,而不是由主机编译器 g++ 编译。因此,您需要将所有 Thrust 和 CUDA 设备代码移动到 .cu 文件中的函数中,这些函数可以从您的 .cpp 文件中调用。

关于c++ - 如何编译 thrust 和 c++ 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11170420/

相关文章:

c++ - 使用全局声明的 vector 时 C++ 中的双重错误/损坏

c++ - 库尝试包含 <string.h> 但包含我的项目中的 "string.h",如何防止?

java - 将 .class 文件转换为 .cap JavaCard 3.0.2 Connected Edition

c# - 如何使用 CUdeviceptr 执行 CudaMemcpy

C++ lambda 表达式 - 编译器如何解释它们?

C++: vector 的 vector

c++ - 是 CUDA 严重优化了这段代码还是我错了?

c++ - 处理 vector - cudaMemcpyDeviceToHost

c++ - 用 2 维数组初始化 3 维数组

gcc - 原生树莓派编译问题