在 CUDA/thrust 中执行向量求和

Perform sum of vectors in CUDA/thrust

所以我尝试在 CUDA 中实现随机梯度下降,我的想法是将其并行化,类似于论文中描述的方式 Optimal Distributed Online Prediction Using Mini-Batches

该实现针对 MapReduce 分布式环境,因此我不确定它在使用 GPU 时是否最佳。

简而言之,这个想法是:在每次迭代中,计算批处理(地图)中每个数据点的误差梯度,通过 sum/reducing 梯度取它们的平均值,最后执行梯度步骤更新根据平均梯度加权。下一次迭代从更新的权重开始。

thrust 库允许我对向量执行归约,例如允许我对向量中的所有元素求和。

我的问题是:如何在 CUDA/thrust 中 sum/reduce 一个向量数组? 输入将是一个向量数组,输出将是一个向量,它是数组中所有向量的总和(或者,理想情况下,它们的平均值)。

将我的评论转换成这个答案:

假设每个向量的长度为 m,数组的大小为 n。 "array of vectors" 与大小为 n x m 的矩阵相同。

如果您将存储格式从 "array of vectors" 更改为大小为 n * m 的单个向量,则可以使用 thrust::reduce_by_key 分别对该矩阵的每一行求和。

sum_rows 示例显示了如何执行此操作。