2

我开始使用 NVidia Thrust 库,它是 CUDA 4.0 工具包的一部分,我想在深入挖掘之前验证一些东西。我可以执行以下操作并且在构建过程中没有问题:

thrust::host_vector <int> iVec;
thrust::device_vector <int> iVec2;
thrust::host_vector <std::string> sVec;

当我尝试以下操作时,出现编译错误:

    thrust::device_vector <std::string> sVec2;

我想知道的是,我是否可以假设我可以在 STL 向量中使用的任何数据类型都可以在推力向量中使用,而不管它是设备还是主机?还是这里有限制,我不应该指望这会起作用?

我得到的错误如下:

c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\detail\device\cuda\for_each.inl(93): error C2027: use of undefined type 'thrust::detail::STATIC_ASSERTION_FAILURE' 1> with 1> [ 1> x=false 1> ] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\detail\device\dispatch\for_each.h(56) :请参阅对函数模板实例化 'RandomAccessIterator 推力::detail::device::cuda::for_each_n(RandomAccessIterator,Size,UnaryFunction)' 的引用 1> 与 1> [ 1> RandomAccessIterator=thrust::detail::normal_iterator>, 1> Size=__w64 int, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\detail\device\for_each.inl(43) :参见函数模板实例化的参考 'RandomAccessIteratorthrust::detail::device::dispatch:: for_each_n(RandomAccessIterator,Size,UnaryFunction,thrust::detail::cuda_device_space_tag)' 正在编译 1> with 1> [ 1> RandomAccessIterator=thrust::detail::normal_iterator>, 1> OutputIterator=thrust::detail::normal_iterator> , 1> Size=__w64 int, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia gpu计算工具包\cuda\v4.0\include\thrust\detail\device\for_each .inl(54) : 参见函数模板实例化 'OutputIteratorthrust::detail::device::for_each_n(OutputIterator,Size,UnaryFunction)' 正在编译 1> with 1> [ 1> OutputIterator=thrust::detail::normal_iterator>, 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust:: detail::device_destroy_functor, 1> Size=__w64 int 1> ] 1> c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\detail\dispatch\for_each.h(72) : 见参考到函数模板实例化 'InputIteratorthrust::detail::device::for_each(InputIterator,InputIterator,UnaryFunction)' 正在编译 1> 1> [ 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust ::detail::device_destroy_functor 1> ] 1>c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\detail\for_each.inl(51) : 见参考函数模板实例化'InputIteratorthrust::detail::dispatch::for_each(InputIterator ,InputIterator,UnaryFunction,thrust::device_space_tag)' 正在编译 1> with 1> [ 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c: \program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\detail\for_each.inl(67) : 见参考函数模板实例化'InputIteratorthrust::detail::for_each(InputIterator,InputIterator,UnaryFunction) ' 正在编译 1> 与 1> [ 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia gpu计算工具包\cuda\v4.0\include\thrust\detail\dispatch\destroy.h(59) : 参见函数模板实例化 'void 推力::for_each>(InputIterator,InputIterator,UnaryFunction)' 正在编译 1> 和 1> [ 1> ForwardIterator=thrust::detail::normal_iterator>, 1> T=value_type, 1 > InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia gpu计算工具包\cuda\v4.0\include\thrust\detail \destroy.h(42) : 参见对函数模板实例化的参考 'voidthrust::detail::dispatch::destroy(ForwardIterator,ForwardIterator,thrust::detail::false_type)' 正在编译 1> 带有 1> [ 1> ForwardIterator=thrust::detail::normal_iterator> 1> ] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\detail\vector_base.inl(442) :请参阅正在编译的函数模板实例化 'voidthrust::detail::destroy>(ForwardIterator,ForwardIterator)' 1> 1> [ 1> Pointer=thrust::device_ptr, 1> ForwardIterator=thrust::detail::normal_iterator> 1> ] 1> c:\program files\nvidia gpu计算工具包\cuda\v4.0\include\thrust\ detail\vector_base.inl(440) : 在编译类模板成员函数'thrust::detail::vector_base::~vector_base(void)' 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0 \include\thrust\device_vector.h(55) : 请参阅对类模板实例化 'thrust::detail::vector_base' 的引用 1> 编译 1> [ 1> T=std::string, 1> Alloc=thrust: :device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) : 参见类模板实例化 'thrust::device_vector' 正在编译 1> 和 1> [ 1> T=std ::string 1> ] ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\device_vector.h (55) : 参见对类模板实例化 'thrust::detail::vector_base' 的引用 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c :\users\fsquared\mydata\idata\main.cpp(119) : 参见对类模板实例化 'thrust::device_vector' 的引用正在编译 1> with 1> [ 1> T=std::string 1> ] == ======== 构建:0 成功,1 失败,0 最新,0 跳过 ==========with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\device_vector.h (55) : 参见对类模板实例化 'thrust::detail::vector_base' 的引用 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c :\users\fsquared\mydata\idata\main.cpp(119) : 参见对类模板实例化 'thrust::device_vector' 的引用正在编译 1> with 1> [ 1> T=std::string 1> ] == ======== 构建:0 成功,1 失败,0 最新,0 跳过 ==========T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\device_vector.h(55) : 见参考到类模板实例化 'thrust::detail::vector_base' 正在编译 1> 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\ mydata\idata\main.cpp(119) : 参见对类模板实例化 'thrust::device_vector' 的引用 1> with 1> [ 1> T=std::string 1> ] ======== == 构建:0 成功,1 失败,0 最新,0 跳过 ==========T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\device_vector.h(55) : 见参考到类模板实例化 'thrust::detail::vector_base' 正在编译 1> 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\ mydata\idata\main.cpp(119) : 参见对类模板实例化 'thrust::device_vector' 的引用 1> with 1> [ 1> T=std::string 1> ] ======== == 构建:0 成功,1 失败,0 最新,0 跳过 ==========] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\device_vector.h(55) : 请参阅正在编译的类模板实例化'thrust::detail::vector_base' 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) :参见类模板实例化的参考'thrust::device_vector' 正在编译 1> 1> [ 1> T=std::string 1> ] ========== 构建:0 成功,1 失败,0 最新, 0 跳过 ===========] 1> c:\program files\nvidia gpu 计算工具包\cuda\v4.0\include\thrust\device_vector.h(55) : 请参阅正在编译的类模板实例化'thrust::detail::vector_base' 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) :参见类模板实例化的参考'thrust::device_vector' 正在编译 1> 1> [ 1> T=std::string 1> ] ========== 构建:0 成功,1 失败,0 最新, 0 跳过 ===========vector_base' 正在编译 1> 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) :请参阅正在编译的类模板实例化 'thrust::device_vector' 的引用 1> 使用 1> [ 1> T=std::string 1> ] ========== 构建:0 成功,1 失败,0最新,0 跳过 ==========vector_base' 正在编译 1> 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) :请参阅正在编译的类模板实例化 'thrust::device_vector' 的引用 1> 使用 1> [ 1> T=std::string 1> ] ========== 构建:0 成功,1 失败,0最新,0 跳过 ==========T=std::string 1> ] ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========T=std::string 1> ] ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

I am using MSCV 2010 here.

4

1 回答 1

2

CUDA does not support standard C++ container types in device code, it is basically limited to C++ POD types only. You can define your own classes for use on the GPU, but the constructor and member functions must be defined as CUDA __device__ functions, and there are still a number of limitations on what language features are support in device code.

于 2011-05-09T02:22:28.760 回答