如何将 device_vector 的每个元素递减一个常数?

Posted

技术标签:

【中文标题】如何将 device_vector 的每个元素递减一个常数?【英文标题】:How to decrement each element of a device_vector by a constant? 【发布时间】:2012-03-29 02:10:38 【问题描述】:

我正在尝试使用thrust::transformdevice_vector 的每个元素中减少一个常量值。如您所见,最后一行是不完整的。我正在尝试从所有元素中减少常量fLowestVal,但不知道具体如何。

thrust::device_ptr<float> pWrapper(p);
thrust::device_vector<float> dVector(pWrapper, pWrapper + MAXX * MAXY);
float fLowestVal = *thrust::min_element(dVector.begin(), dVector.end(),thrust::minimum<float>());

// XXX What goes here?
thrust::transform(...);

另一个问题:一旦我对device_vector 进行了更改,这些更改是否也适用于p 数组?

谢谢!

【问题讨论】:

【参考方案1】:

您可以通过将for_each 与占位符表达式组合来从device_vector 的每个元素中减少一个常量值:

#include <thrust/functional.h>
...
using thrust::placeholders;
thrust::for_each(vec.begin(), vec.end(), _1 -= val);

不寻常的_1 -= val 语法意味着创建一个未命名的函子,其工作是将其第一个参数减少val_1 位于命名空间 thrust::placeholders 中,我们可以通过 using thrust::placeholders 指令访问它。

您也可以通过将 for_eachtransform 与您自己提供的自定义仿函数组合来做到这一点,但它更冗长。

【讨论】:

哇,这就是我要找的东西!能否详细说明 for_each 函数的性能? @igalk 此类功能受限于带宽。性能应该“尽可能快地读写”【参考方案2】:

在广泛的上下文中可能有用的一个选项是使用 Thrust 的一个花哨的迭代器作为 thrust::transform 的参数。在这里,您将与 thrust::minus 二进制函数对象一起执行此操作,如下所示:

#include <thrust/transform.h>
#include <thrust/iterator/constant_iterator.h>
#include <thrust/functional.h>
...
thrust::transform(vec.begin(),
                  vec.end(),
                  thrust::make_constant_iterator(value),
                  vec.begin(),
                  thrust::minus<float>());

花哨的迭代器的文档可以在here找到。

【讨论】:

感谢 eesweng 指出了之前的参数排序错误。

以上是关于如何将 device_vector 的每个元素递减一个常数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 std::vector<thrust::device_vector<int>> 转换为 int**?

使用推力的向量数组

常量内存中的推力::device_vector

将二维推力::device_vector 复矩阵传递给 CUDA 核函数

LeetCode 1144. 递减元素使数组呈锯齿状

LeetCode 1144. 递减元素使数组呈锯齿状