如何将 device_vector 的每个元素递减一个常数?
Posted
技术标签:
【中文标题】如何将 device_vector 的每个元素递减一个常数?【英文标题】:How to decrement each element of a device_vector by a constant? 【发布时间】:2012-03-29 02:10:38 【问题描述】:我正在尝试使用thrust::transform
从device_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_each
或 transform
与您自己提供的自定义仿函数组合来做到这一点,但它更冗长。
【讨论】:
哇,这就是我要找的东西!能否详细说明 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**?