我有一个在 CUDA 中求解方程组的应用程序,我确信每个线程最多可以找到 4 个解,但是如何将其复制回主机?
我将一个具有足够空间的巨大数组传递给所有线程存储 4 个解决方案(每个解决方案 4 个双倍),另一个具有每个线程的解决方案数量,但是这是一个天真的解决方案,并且是我内核的当前瓶颈。
我真的很喜欢优化这个。主要问题是在单个数组中连接每个线程的可变数量的解决方案。
我有一个在 CUDA 中求解方程组的应用程序,我确信每个线程最多可以找到 4 个解,但是如何将其复制回主机?
我将一个具有足够空间的巨大数组传递给所有线程存储 4 个解决方案(每个解决方案 4 个双倍),另一个具有每个线程的解决方案数量,但是这是一个天真的解决方案,并且是我内核的当前瓶颈。
我真的很喜欢优化这个。主要问题是在单个数组中连接每个线程的可变数量的解决方案。
您正在寻找的功能称为流压缩。
您可能确实需要提供一个数组,其中每个线程包含 4 个解决方案的空间,因为尝试以紧凑的形式直接存储结果可能会在线程之间创建如此多的依赖关系,以至于能够将更少的数据复制回所获得的性能主机因内核执行时间较长而丢失。例外情况是,如果几乎所有线程都找不到解决方案。在这种情况下,您也许可以使用原子操作来维护数组的索引。因此,对于找到的每个解决方案,您将其存储在索引处的数组中,然后使用原子操作来增加索引。我认为为此使用 atomicAdd() 是安全的。在存储结果之前,线程将使用 atomicAdd() 将索引增加一。atomicAdd() 返回旧值,
但是,考虑到更常见的情况,即有相当数量的结果,最好的解决方案是将压缩操作作为单独的步骤执行。一种方法是使用thrust::copy_if
. 有关更多背景信息,请参阅此问题。