Cuda 一个小小的难题
我有数组Cuda 一个小小的难题,cuda,Cuda,我有数组A[0…N]ofdouble和数组B[0…N]ofint。每个B[i]在[0…P]中变化。我只需要计算数组C[0…P]: C[j] = SUM( A[i] : B[i] = j) 我不能将N线程与atomicAdd()函数一起使用,因为据我所知,它不支持double。使用P线程的简单实现是高度不同的。有更好的方法吗?如果我理解正确,您正试图通过B中的整数键对双精度数组a进行求和减少。模板库包含此操作的操作。该示例演示了如何在类似的应用程序中使用reduce_by_key,尽管它使用计数
A[0…N]
ofdouble
和数组B[0…N]
ofint
。每个B[i]
在[0…P]
中变化。我只需要计算数组C[0…P]
:
C[j] = SUM( A[i] : B[i] = j)
我不能将
N
线程与atomicAdd()
函数一起使用,因为据我所知,它不支持double
。使用P
线程的简单实现是高度不同的。有更好的方法吗?如果我理解正确,您正试图通过B
中的整数键对双精度数组a
进行求和减少。模板库包含此操作的操作。该示例演示了如何在类似的应用程序中使用reduce_by_key,尽管它使用计数迭代器来生成密钥,而不是使用用户提供的密钥向量。根据您的需要修改它应该很简单。+1对于“难题”一词的使用,我认为这只是一种关键的简化(即,使用struct::reduce\u by\u key
),但我无法准确理解SUM(a[I]:B[I]=j)的含义。在任何情况下,我都不建议使用atomicAdd
,即使A
类型为float
atomicAdd
意味着任意大的序列化,这取决于C
中值的分布。该表达式意味着C[j]
是所有A[i]
的总和,因此B[i]=j
实际上,你是对的。谢谢你对我问题的另一个回答。剩下的唯一问题是查看推力代码并找出实现的算法。这对于一个使用推力的新手来说并不容易。@AdelNick:我建议直接使用推力。您可以使用推力::设备_向量
轻松地包装现有设备内存指针,并在主机代码中调用按_键减少
。推力包含在CUDA工具包的最新版本(4.0和4.1开发者预览版)中,因此您不需要安装任何东西就可以使用它。