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