我想将部分缩减结果存储在数组中。
说我有
data[8] = {10,20,30,40,50,60,70,80}
。
如果我将 data
与 chunk_size
的 2
分开,每个块将像 {10,20}
, {30,40}
, ... , {70,80}
.
如果我以求和为目标,总的减少量将是
360
,我想得到一个partial_sums = {30,70,110,150}
的数组,它存储每个块的部分和。
到目前为止,我想到的是构建一个迭代器
strided_iterator
,它将访问0、2、... data[8] = {10,20,30,40,50,60,70,80}
的第一个索引以及类似thrust::reduce(stride_iterator, stride_iterator + 2, partial_sums.begin(), thrust::plus<int>());
的东西给出所需的结果,但不知道如何这能有效地完成吗?
对于跨步访问,https://github.com/NVIDIA/thrust/blob/master/examples/strided_range.cu 有一个解决方案,但这似乎不适用于存储部分减少。
我当然可以用这样的循环来残酷地做,
for (int i = 0; i<4; i++) {
partial_sums[i] = thrust::reduce(data+2*i, data+2*i+2, 0, thrust::plus<int>());
}
但这种做法正是CUDA thrust力求尽量避免的,对吧?不知何故,我应该能够把它全部放在一个单一的推力调用中。