NVidia Thrust device_vector 字符串
Posted
技术标签:
【中文标题】NVidia Thrust device_vector 字符串【英文标题】:NVidia Thrust device_vector of strings 【发布时间】:2011-08-21 08:21:24 【问题描述】:我开始使用 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 计算工具包\cuda\v4.0\include\thrust\detail\device\cuda\for_each.inl(93): error C2027: use of undefined type 'thrust::detail: :STATIC_ASSERTION_FAILURE' 1> 与 1> [ 1> x=假 1>] 1> c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\detail\device\dispatch\for_each.h(56) : 见参考函数模板实例化'RandomAccessIteratorthrust::detail:: device::cuda::for_each_n(RandomAccessIterator,Size,UnaryFunction)' 正在编译 1> 与 1> [ 1> RandomAccessIterator=thrust::detail::normal_iterator>, 1> 大小=__w64 整数, 1> UnaryFunction=thrust::detail::device_destroy_functor 1>] 1> c:\program files\nvidia gpu computing toolkit\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> 与 1> [ 1> RandomAccessIterator=thrust::detail::normal_iterator>, 1> OutputIterator=thrust::detail::normal_iterator>, 1> 大小=__w64 整数, 1> UnaryFunction=thrust::detail::device_destroy_functor 1>] 1> c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\detail\device\for_each.inl(54) : 见参考函数模板实例化'OutputIteratorthrust::detail::device: :for_each_n(OutputIterator,Size,UnaryFunction)' 正在编译 1> 与 1> [ 1> OutputIterator=thrust::detail::normal_iterator>, 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust::detail::device_destroy_functor, 1> 大小=__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> 与 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(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 computing toolkit\cuda\v4.0\include\thrust\detail\dispatch\destroy.h(59) : 见参考函数模板实例化'voidthrust::for_each>(InputIterator, InputIterator,UnaryFunction)' 正在编译 1> 与 1> [ 1> ForwardIterator=thrust::detail::normal_iterator>, 1> T=值类型, 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\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 computing toolkit\cuda\v4.0\include\thrust\detail\vector_base.inl(442) : 见参考函数模板实例化'voidthrust::detail::destroy>(ForwardIterator ,ForwardIterator)' 正在编译 1> 与 1> [ 1> 指针=推力::device_ptr, 1> ForwardIterator=thrust::detail::normal_iterator> 1>] 1> c:\program files\nvidia gpu computing toolkit\cuda\v4.0\include\thrust\detail\vector_base.inl(440) : 在编译类模板成员函数'thrust::detail::vector_base::~vector_base (空白)' 1> 与 1> [ 1> T=std::字符串, 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::字符串, 1> Alloc=thrust::device_malloc_allocator 1>] 1> c:\users\fsquared\mydata\idata\main.cpp(119) : 请参阅对正在编译的类模板实例化 'thrust::device_vector' 的引用 1> 与 1> [ 1> T=std::字符串 1>] ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
我在这里使用 MSCV 2010。
【问题讨论】:
我对 CUDA 或推力都没有经验(因此这不是答案),但我认为设备必须支持数据类型,我怀疑是否支持 C++ 类CUDA。还要记住 std::string 不是一个简单的标准数据类型,而是一个 C++ 类,也不是一个简单的类(很多模板的东西)。它可以与指向字符串的指针或普通的旧 char 数组一起使用,但我只是在猜测。 【参考方案1】:CUDA 不支持设备代码中的标准 C++ 容器类型,它基本上仅限于 C++ POD 类型。您可以定义自己的类以在 GPU 上使用,但构造函数和成员函数必须定义为 CUDA __device__
函数,并且设备代码中支持哪些语言功能仍然存在许多限制。
【讨论】:
以上是关于NVidia Thrust device_vector 字符串的主要内容,如果未能解决你的问题,请参考以下文章
在thrust::device_vector (CUDA Thrust) 上的thrust::min_element 崩溃
我可以使用thrust::host_vector 还是必须使用cudaHostAlloc 进行Thrust 的零拷贝?