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