使用 CUDA Thrust 查找最大元素值及其位置
如何不仅获取值,还获取最大(最小)元素(res.val
和 res.pos
)的位置?
thrust::host_vector<float> h_vec(100);
thrust::generate(h_vec.begin(), h_vec.end(), rand);
thrust::device_vector<float> d_vec = h_vec;
T res = -1;
res = thrust::reduce(d_vec.begin(), d_vec.end(), res, thrust::maximum<T>());
How do I get not only the value but also the position of the maximum (minimum) element (res.val
and res.pos
)?
thrust::host_vector<float> h_vec(100);
thrust::generate(h_vec.begin(), h_vec.end(), rand);
thrust::device_vector<float> d_vec = h_vec;
T res = -1;
res = thrust::reduce(d_vec.begin(), d_vec.end(), res, thrust::maximum<T>());
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不要使用
thrust::reduce
。在thrust/extrema.h
中使用thrust::max_element
(thrust::min_element
):将空范围传递给
时要小心max_element
——您将无法安全地取消引用结果。Don't use
thrust::reduce
. Usethrust::max_element
(thrust::min_element
) inthrust/extrema.h
:Be careful when passing an empty range to
max_element
-- you won't be able to safely dereference the result.Jared Hoberock 已经圆满地回答了这个问题。我想在下面提供一个细微的更改,以解决当数组由
cudaMalloc
而不是通过device_vector
容器分配时的常见情况。这个想法是将
device_pointer
dev_ptr
包裹在cudaMalloc
的原始指针周围,转换min_element
的输出(我正在考虑device_pointer
min_ptr
的最小值而不是最大值(不失一般性),然后找到最小值作为min_ptr[0]以及
&min_ptr[0] - &dev_ptr[0]
的位置。Jared Hoberock has already satisfactorily answered this question. I want to provide below a slight change to account for the common case when the array has been allocated by
cudaMalloc
and not through adevice_vector
container.The idea is to wrap a
device_pointer
dev_ptr
around thecudaMalloc
'ed raw pointer, casting the output ofmin_element
(I'm considering the minimum instead of the maximum without any loss of generality) to adevice_pointer
min_ptr
and then finding the minimum value asmin_ptr[0]
and the position by&min_ptr[0] - &dev_ptr[0]
.