如何使用push min_element算法,在设备和主机之间没有memcpys

wee*_*not 5 cuda thrust

我正在优化pycuda /推力计划.在其中,我使用thrust :: min_element来识别设备上的数组中的最小元素的索引.

使用Nvidia的可视化分析器,似乎每当我打电话时thrust::min_element,都有一个DtoH(设备到主机)memcpy.我想要的只是在设备上进行的一切.换句话说,min_element()的输出应存储在设备上,我可以在以后使用它,而不会花费小DtoH memcpy的成本.有没有办法做到这一点?还是我错误地思考问题?

我的尝试是在下面,其中的想法是将指向的数组中最小元素的索引input_ptr放入指向的数组的第一个元素中output_ptr.一切都应该在设备上完成,主机上没有任何东西.

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

#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));
}
Run Code Online (Sandbox Code Playgroud)

wee*_*not 2

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

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

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

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