Optimization 如何在CUDA中有效地从线程收集数据?

Optimization 如何在CUDA中有效地从线程收集数据?,optimization,cuda,gpu,gpgpu,Optimization,Cuda,Gpu,Gpgpu,我有一个在CUDA中求解方程组的应用程序,我确信每个线程最多可以找到4个解,但我如何才能复制回主机 我正在传递一个巨大的数组,该数组有足够的空间给所有线程存储4个解决方案(每个解决方案4个双倍),另一个数组有每个线程的解决方案数,但是这是一个幼稚的解决方案,是我内核当前的瓶颈 我真的很喜欢优化这个。主要问题是在单个数组中连接每个线程的不同数量的解决方案。您正在寻找的功能称为流压缩 您可能确实需要提供一个数组,该数组包含每个线程4个解决方案的空间,因为试图以紧凑的形式直接存储结果可能会在线程之间创

我有一个在CUDA中求解方程组的应用程序,我确信每个线程最多可以找到4个解,但我如何才能复制回主机

我正在传递一个巨大的数组,该数组有足够的空间给所有线程存储4个解决方案(每个解决方案4个双倍),另一个数组有每个线程的解决方案数,但是这是一个幼稚的解决方案,是我内核当前的瓶颈


我真的很喜欢优化这个。主要问题是在单个数组中连接每个线程的不同数量的解决方案。

您正在寻找的功能称为流压缩

您可能确实需要提供一个数组,该数组包含每个线程4个解决方案的空间,因为试图以紧凑的形式直接存储结果可能会在线程之间创建太多的依赖关系,因此,通过将较少的数据复制回主机而获得的性能会因内核执行时间的延长而丢失。例外情况是,如果几乎所有线程都找不到解决方案。在这种情况下,您可能可以使用原子操作来维护数组中的索引。因此,对于找到的每个解决方案,您将其存储在索引处的数组中,然后使用原子操作来增加索引。我认为使用atomicAdd()进行此操作是安全的。在存储结果之前,线程将使用atomicAdd()将索引增加1。atomicAdd()返回旧值,线程可以使用旧值作为索引来存储结果


然而,考虑到一种更常见的情况,即有相当多的结果,最好的解决方案是将压实操作作为一个单独的步骤进行。一种方法是使用
asch::copy\u if
。有关更多背景信息,请参阅。

如果我对您的程序有更多了解,帮助会容易得多。据我所知(我和cuda的关系已经一年了,所以我可能错了),memcopies是检索信息的唯一方法,而且速度很慢。什么卡上有什么版本的cuda?我有一个cuda 4.0和4.2。代码太大了,不能放在这里。我同意cudaMemCpy是获得结果的唯一方法,但我可以避免垃圾复制。