问题标签 [thrust]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2720 浏览

c++ - 使用 Nvidia 的 Thrust 库规范化一堆向量

我刚刚了解了 Nvidia 的推力库。只是为了尝试它写了一个小例子,它应该规范化一堆向量。

上面的示例似乎有效,但是我无法将数据复制回来。我认为一个简单的分配会调用 cudaMemcpy。它可以将数据从主机复制到设备但不能返回???

其次,我不确定我这样做是否正确。for_each的文档说:

for_each 将函数对象 f 应用于 [first, last) 范围内的每个元素;f 的返回值(如果有)将被忽略。

但是 unary_function 结构模板需要两个模板参数(一个用于返回值)并强制 operator() 也返回一个值,这会导致编译时出现警告。我不明白我应该如何编写一个没有返回值的一元仿函数。

接下来是数据排列。我只是选择了 double4,因为这将导致两个获取指令 ld.v2.f64 和 ld.f64 IIRC。但是我想知道推力如何在后台获取数据(以及创建了多少 cuda 线程/块)。如果我选择 4 个向量的结构,它是否能够以合并的方式获取数据。

最后推力提供元组。元组数组呢?在这种情况下如何安排数据。

我浏览了这些示例,但我没有找到一个示例来解释为一堆向量选择哪种数据结构(dot_products_with_zip.cu 示例说明了“数组结构”而不是“结构数组”,但我明白了示例中未使用任何结构。

更新

我修复了上面的代码并尝试运行一个更大的示例,这次是对 10k 个向量进行归一化。

使用 computeprof 进行分析向我展示了低占用率和未合并的内存访问:

我想知道如何优化这个?

0 投票
1 回答
1668 浏览

sorting - 推力:sort_by_key 与 zip_iterator 性能

问题

我正在使用sort_by_key使用 a 传递的值zip_iterator。这sort_by_key被调用了很多次,并且在一定的迭代之后它变得了 10 倍!这种性能下降的原因是什么?

症状

我正在使用 对 3 个向量进行排序sort_by_key,其中一个作为关键向量:

向量的大小通常约为 400 万。在最初的 2 次调用中,sort_by_key需要 0.04 秒,在循环 3 中需要 0.1 秒,然后在其余循环中进一步降级到 0.3 秒。因此,我们看到性能下降了 10 倍。

额外的信息

为了确保降级的唯一因素是sort_by_key,我用手写内核手动排序替换了上述内容:

这种手写排序需要 0.03 秒,并且这种性能在所有迭代中都是一致的,这与 sort_by_key 和 zip_iterator 看到的性能下降不同。

0 投票
1 回答
2955 浏览

c++ - NVidia Thrust device_vector 字符串

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

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

我想知道的是,我是否可以假设我可以在 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.

0 投票
1 回答
2892 浏览

cuda - Thrust::Sort 编译时间很长

我正在尝试使用 Thrust 编译一个示例代码块,以帮助学习一些 CUDA。

我正在使用 Visual Studio 2010,并且我已经获得了其他要编译的示例。然而,当我编译这个例子时,编译需要超过 10 分钟。我有选择地注释掉了行,并发现它的 Thrust::sort 行需要永远(注释掉一行大约需要 5 秒编译)。

我在某处发现了一篇文章,其中谈到了在 Thrust 中编译 sort 的速度有多慢,这是 Thrust 开发团队做出的决定(它在运行时快 3 倍,但编译时间更长)。但那个帖子是在 2008 年底。

知道为什么这需要这么长时间吗?

另外,我正在使用以下规格的机器上编译,所以它不是一台慢速机器

i7-2600k @ 4.5 ghz
16 GB DDR3 @ 1833 mhz
Raid 0 of 6 GB/s 1TB 驱动器

根据要求,这是看起来像 Visual Studio 正在调用的构建字符串

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\bin\nvcc.exe" -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\include" -G0 --keep-dir "Debug\" -maxrregcount=32 --machine 64 --compile -D_NEXUS_DEBUG -g -Xcompiler "/EHsc /nologo / od /Zi /MTd " -o "Debug\kernel.obj" "C:\Users\Rob\Desktop\VS2010Test\VS2010Test\VS2010Test\kernel.cpp" -clean

例子

0 投票
2 回答
312 浏览

c++ - 在 CUDA C 项目中使用 C++

我正在 CUDA C 中实现排序和流压缩算法。但是我刚刚发现自己实现这些算法并具有良好的性能并不是那么简单。鉴于我正在使用矩阵,我不能使用 CUDPP,因此,虽然我避免使用它,但我将不得不使用推力库(我对 C++ 一无所知)。

我一直在用 C 编程,我真的只是想用 C++ 来处理推力,所以基本上我想知道我是否可以在 C 中拥有大部分代码,然后拥有少量 C++ 代码(我猜我会必须使用“外部”功能),但我想确定它在 CUDA 中是否可行。

提前致谢。

0 投票
1 回答
435 浏览

cuda - 组装一个 CUDA 项目

我一直在扫描该站点以查找有关大型 CUDA 项目的问题,并且我找到了一些很好的答复,无论如何我还有一些疑问。

我的程序,现在(它还没有完成),输出一些数组,然后输入到 Thrust 库函数。

所以我的主要疑问是:

1-鉴于我使用的是 CUDA C,我将推力函数声明为 extern "C"。我不确定在头文件中声明这些函数的正确方法,经过一番谷歌搜索后,我发现了以下代码,我想确定它是正确的:

2-我在论坛上看到一些帖子,使用“Main.cpp”作为主文件,使用“Main.cu”文件是错误的还是无所谓的?

编辑:经过一番思考(和建议),我真的认为旧问题有点沉闷。

在此先感谢并感谢 talonmies 的建议

0 投票
1 回答
2478 浏览

cuda - CUDA/Thrust 双指针问题(指针向量)

大家好,我正在使用 CUDA 和 Thrust 库。当我尝试访问 CUDA 内核上的双指针时遇到问题,该内核加载了来自主机的 Object*(指针向量)类型的推力::device_vector。当使用“nvcc -o 推力 main.cpp cukernel.cu”编译时,我收到警告“警告:无法判断指针指向的内容,假设为全局内存空间”,并在尝试运行程序时出现启动错误。

我已经阅读了 Nvidia 论坛,解决方案似乎是“不要在 CUDA 内核中使用双指针”。在发送到内核之前,我不希望将双指针折叠成一维指针......有没有人找到解决这个问题的方法?所需代码如下,在此先感谢!

0 投票
1 回答
553 浏览

matlab - 使用 CUDA 的 Thrust 库处理大值

嗨,我想实现一个推力非常大的循环,但我发现它比普通的 C++ 代码慢得多。你能告诉我我哪里出错了。fi 和 fj 是宿主向量

xsize 通常是一个 7-8 位数字

我觉得代码没有被并行化。你能帮帮我吗?

0 投票
3 回答
1574 浏览

c++ - CUDA/推力图像处理

我无法找到有关 Thrust 库是否支持矩阵运算的任何信息。因此,我想知道是否可以在图像处理中使用推力库?我也想看看任何例子。

感谢您的任何回复。

0 投票
1 回答
2508 浏览

sorting - 推力库基数排序的 CUDA 编程

Thrust 新手 - 在我的 VS2010 C++ 程序中,我工作正常:

但现在我想使用推力:: stable_radix_sort_key。我添加了包括 -

但是VS找不到"thrust :: stable_radix_sort_key ( ...)"

我认为在他们的目录中找不到相关的头文件?怎么了。有没有人有一些示例代码来调用这个推力库例程?

谢谢。