Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda 一个小小的难题_Cuda - Fatal编程技术网

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]
of
double
和数组
B[0…N]
of
int
。每个
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开发者预览版)中,因此您不需要安装任何东西就可以使用它。