如何通过常量减少device_vector的每个元素?

时间:2012-03-12 16:37:57

标签: cuda thrust

我正在尝试使用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数组?

谢谢!

2 个答案:

答案 0 :(得分:6)

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

#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与您自己提供的自定义仿函数相结合,但它更详细。

答案 1 :(得分:0)

在广泛的上下文中可能有用的一个选项是使用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(),
                  vec.begin(),
                  thrust::make_constant_iterator(value),
                  thrust::minus<float>());

有关花式迭代器的文档,请参见here