所以我试图在CUDA中实现随机梯度下降,我的想法是将其并行化,类似于论文中描述的方式Optimal Distributed Online Prediction Using Mini-Batches
该实现针对MapReduce分布式环境,因此我不确定它在使用GPU时是否最佳。
简而言之,这个想法是:在每次迭代时,计算批次(地图)中每个数据点的误差梯度,取平均值/减小梯度,最后执行梯度步骤根据平均梯度。下一次迭代从更新的权重开始。
thrust库允许我对向量执行减少,例如,我可以对向量中的所有元素求和。
我的问题是:如何在CUDA /推力中求和/减少一组向量? 输入将是一个向量数组,输出将是一个向量,它是数组中所有向量的总和(或者,理想情况下,它们的平均值)。
答案 0 :(得分:2)
将我的评论转换为这个答案:
我们假设每个向量的长度为m
,数组的大小为n
。
一个"向量数组"然后与大小为n x m
的矩阵相同。
如果您从此"向量数组更改存储格式"对于大小为n * m
的单个向量,您可以使用thrust::reduce_by_key
分别对此矩阵的每一行求和。
sum_rows
示例显示了如何执行此操作。