cuda - 如何在设备和主机之间不使用 memcpys 的情况下使用推力 min_element 算法

标签 cuda thrust

我正在优化 pycuda/推力程序。其中,我使用 thrust::min_element标识设备上数组中最小元素的索引。

使用 Nvidia 的可视化分析器,似乎每当我调用 thrust::min_element 时,有一个 DtoH(设备到主机)memcpy。我希望一切都只在设备上进行。换句话说,min_element() 的输出应该存储在设备上,我以后可以在那里使用它,而不会遭受小型 DtoH memcpy 的成本。有没有办法做到这一点?还是我在以错误的方式思考问题?

我在下面尝试这样做,其中的想法是放置 input_ptr 指向的数组中最小元素的索引。进入 output_ptr 指向的数组的第一个元素.一切都应该在设备上完成,在主机上什么也不做。

此代码产生正确的答案,但涉及不需要的 memcpy。非常感谢您提供的任何帮助。

#include <thrust/extrema.h>
#include <thrust/device_vector.h>
#include <cuda.h>

void my_min_element(CUdeviceptr input_ptr, int length, CUdeviceptr output_ptr)
{
  thrust::device_ptr<float> i_ptr((float*)input_ptr);
  thrust::device_ptr<int> o_ptr((int*)output_ptr);
  o_ptr[0] = thrust::distance(i_ptr,thrust::min_element(i_ptr, i_ptr+length));
}

最佳答案

我找到了我自己问题的(令人失望的)答案:

我从 CUDA 开发团队 [link] 的某个人那里找到了这句话

“我不是 Thrust 专家,所以对这个反馈持保留态度;但我认为 Thrust 的这个设计元素值得重新审视。Thrust 的表现力和有用的方式有时会因强调将结果返回给主机。我有很多场合想严格在设备内存中执行操作,因此 Thrust 将值返回到主机内存的倾向实际上妨碍了;如果我希望将结果返回给主机,我总是可以传入映射的设备指针(如果 UVA 有效,则表示由 CUDA 分配的任何主机指针)”

..所以看起来我可能不走运。如果是这样,推力的设计缺陷是什么!

关于cuda - 如何在设备和主机之间不使用 memcpys 的情况下使用推力 min_element 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21459147/

相关文章:

c++ - 使用 CUDA 查找数组中未知大小区域的最大值

cuda - 使用 CUDA Thrust 并行执行多个一维移动平均线

带有 optimus 的 cuda 只是为了访问 gpgpu

cuda - 如何最好地将大量字符数组传输到 GPU?

c++ - 两个 CUDA 内核复制内存 - 为什么速度不同?

c++ - CUDA 在执行期间结合线程独立(??)变量

c++ - 编译推力示例代码时找不到头文件

c++ - 使用基数排序对 1 位数组进行排序?

c++ - 与 CUDA 库链接时无法在 Qt Creator 下调试 cpp 代码

cuda - 令人困惑的 cuda 版本