通过CUDA Thrust对具有偶数或奇数索引的元素求和

Ros*_*han 4 cuda sum thrust

如果我使用

 float sum = thrust::transform_reduce(d_a.begin(), d_a.end(), conditional_operator(), 0.f, thrust::plus<float>());
Run Code Online (Sandbox Code Playgroud)

我得到满足条件的所有元素的总和conditional_operator(),如在CUDA中的条件减少.

但我可以总结只有元素d_a[0],d_a[2],d_a[4],d_a[6],.....?

我想过改变条件运算符,但它可以处理数组中的元素而不需要引用索引.

我能做些什么?

tal*_*ies 5

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

  1. 使用推力zip运算符将计数迭代器与输入数据组合,并修改现有的仿函数以接受(索引,数据)元组.当索引符合您的条件时,您可以让仿函数返回数据,否则返回零.这将适用于扫描和缩小算法
  2. 使用推力置换迭代器来收集要求和的数据并将其传递给标准的reduce算法.推力开发人员有一个示例跨步迭代器,您可以使用它来解决仅处理输入迭代器中每个第n个条目的问题.

可能值得同时实施并对它们进行基准测试,以确定哪种方法更快.