make_transform_iterator作为thrust :: reduce算法中的第二个参数有什么意义?

时间:2016-06-17 14:15:13

标签: c++ cuda gpgpu thrust

代码如下:

thrust::reduce(thrust::make_transform_iterator(v.begin(), square()),
                  thrust::make_transform_iterator(v.end(),   square()));

取自transform_iterator示例here。具体来说,使用以下作为第二个迭代器不是多余的吗?

thrust::make_transform_iterator(v.end(), square())

为什么不在其位置使用以下内容?

 thrust::reduce(thrust::make_transform_iterator(v.begin(), square()),
                  v.end());

我想在这个特定的例子中,由于thrust::make_transform_iterator(v.begin(), square())不会产生与v大小不同的迭代器,我的更新代码会与原始代码做同样的事情,这是正确的吗? / p>

修改
我唯一的猜测是确保两个迭代器属于同一类型?所有我发现确认我对此的怀疑是文档中的以下文本“转换仿函数(即square_root和square)继承自thrust :: unary_function。继承自thrust :: unary_function确保仿函数是有效的AdaptableUnaryFunction并提供所有必要的typedef声明。“虽然,我认为这具体指的是仿函数本身。

更新
请参阅Robert Crovella的评论以获得答案。

1 个答案:

答案 0 :(得分:1)

此处的迭代器用于标记特定序列的开头和结尾。 v.end()未标记转换迭代器在此处序列的结尾:

thrust::reduce(thrust::make_transform_iterator(v.begin(), square()),
              v.end());

标志着开始。

这里的其他一些结构可能会有更好的外观(美丽在旁观者眼中),例如:

auto my_iter = thrust::make_transform_iterator(v.begin(), square());
thrust::reduce(my_iter, my_iter+v.size());