用CUDA推力求偶数或奇数指数元素之和

用CUDA推力求偶数或奇数指数元素之和,cuda,sum,thrust,Cuda,Sum,Thrust,如果我使用 float sum = thrust::transform_reduce(d_a.begin(), d_a.end(), conditional_operator(), 0.f, thrust::plus<float>()); float sum=thrust::transform_reduce(d_a.begin()、d_a.end()、条件_操作符()、0.f、thrust::plus()); 我得到满足条件_操作符()提供的条件的所有元素的总和,如中所示 但是

如果我使用

 float sum = thrust::transform_reduce(d_a.begin(), d_a.end(), conditional_operator(), 0.f, thrust::plus<float>());
float sum=thrust::transform_reduce(d_a.begin()、d_a.end()、条件_操作符()、0.f、thrust::plus());
我得到满足
条件_操作符()
提供的条件的所有元素的总和,如中所示

但是,我只能对元素
dua[0]
dua[2]
dua[4]
dua[6]

我想更改条件运算符,但它对数组中的元素有效,而不引用索引


我能为此做些什么?

我可以想出两种方法来解决这类问题:

  • 使用推力zip操作符将计数迭代器与输入数据相结合,并修改现有函子以接受(索引,数据)的元组。当索引与条件匹配时,可以让函子返回数据,否则返回零。这将与扫描和还原算法一起正常工作
  • 使用推力置换迭代器收集要求和的数据,并将其传递给标准reduce算法。推力开发人员有一个示例,您可以使用它来解决只处理输入迭代器中每n个条目的问题

  • 这两种方法可能都值得实施,并对它们进行基准测试,以确定哪种方法更快。

    如果您愿意查找,推力示例中有一个现成的“跨步迭代器”。@talonmies如果您能发布一个简短的答案,指出您在评论中提到的内容,我会投赞成票。