Concurrency 如何在多GPU上实现基数排序?

Concurrency 如何在多GPU上实现基数排序?,concurrency,parallel-processing,cuda,opencl,gpu,Concurrency,Parallel Processing,Cuda,Opencl,Gpu,如何在多个GPU上实现基数排序–与在单个GPU上实现基数排序的方法相同,即先拆分数据,然后在单独的GPU上构建直方图,然后使用合并数据(如一堆卡片)?这种方法可以工作,但我认为这不是最快的方法。具体来说,合并每K位的直方图(K=4是目前最好的)需要在GPU 32/K=8之间交换密钥,以对32位整数进行排序。由于GPU之间的内存带宽(~5GB/s)远低于GPU上的内存带宽(~150GB/s),这将降低性能 更好的策略是将数据分成多个部分,在不同的GPU上对每个部分进行并行排序,然后在最后合并一次这

如何在多个GPU上实现基数排序–与在单个GPU上实现基数排序的方法相同,即先拆分数据,然后在单独的GPU上构建直方图,然后使用合并数据(如一堆卡片)?

这种方法可以工作,但我认为这不是最快的方法。具体来说,合并每K位的直方图(K=4是目前最好的)需要在GPU 32/K=8之间交换密钥,以对32位整数进行排序。由于GPU之间的内存带宽(~5GB/s)远低于GPU上的内存带宽(~150GB/s),这将降低性能


更好的策略是将数据分成多个部分,在不同的GPU上对每个部分进行并行排序,然后在最后合并一次这些部分。这种方法只需要一次GPU之间的传输(与上面的8次相比),因此速度会快得多。

这种方法可以工作,但我认为它不是最快的方法。具体来说,合并每K位的直方图(K=4是目前最好的)需要在GPU 32/K=8之间交换密钥,以对32位整数进行排序。由于GPU之间的内存带宽(~5GB/s)远低于GPU上的内存带宽(~150GB/s),这将降低性能


更好的策略是将数据分成多个部分,在不同的GPU上对每个部分进行并行排序,然后在最后合并一次这些部分。这种方法只需要一次GPU间传输(与上面的8次相比),因此速度会快得多。

不幸的是,这个问题没有得到充分的解决。它取决于元素大小、元素在内存中的起始位置以及您希望排序的元素最终驻留的位置

有时,可以通过将元素存储在共享相同公共前缀的组中来压缩已排序列表,或者可以动态地创建唯一的元素,将每个元素在已排序列表中存储一次,并带有相关计数。例如,您可以将一个巨大的32位整数列表排序为64K个16位值的不同列表,从而将内存需求减半

一般原则是,您希望尽可能减少数据的传递次数,并且吞吐量几乎总是与存储策略相关的带宽限制相对应

如果您的数据集超过了快速内存的大小,您可能希望以合并过程结束,而不是像其他人已经回答的那样继续基数排序

我刚刚进入GPU架构,我不理解上面的K=4评论。我还从未见过这样一个小K可以证明是最优的架构

我怀疑合并直方图也是错误的方法。我可能会让元素在内存中分割,而不是合并直方图。在GPU结构中管理中尺度散布/聚集列表有那么难吗?我当然希望不会

最后,很难想象为什么您希望在这个任务中使用多个GPU。假设您的卡有2GB内存和60GB/s写入带宽(这就是我的中端卡所显示的)。三次基数排序(11位直方图)需要6GB的写入带宽(可能是您的速率限制因素),或者大约100ms来对2GB的32位整数列表进行排序。太好了,已经分类了,现在怎么办?如果您需要在没有某种预处理或压缩的情况下将它们运送到其他任何地方,那么排序时间将很短


无论如何,今天我刚刚编译了我的第一个示例程序。还有很多东西要学。我的目标应用程序是排列密集型的,它与排序密切相关。我相信我将来会再次参与讨论这个问题

不幸的是,这个问题没有被充分提出。它取决于元素大小、元素在内存中的起始位置以及您希望排序的元素最终驻留的位置

有时,可以通过将元素存储在共享相同公共前缀的组中来压缩已排序列表,或者可以动态地创建唯一的元素,将每个元素在已排序列表中存储一次,并带有相关计数。例如,您可以将一个巨大的32位整数列表排序为64K个16位值的不同列表,从而将内存需求减半

一般原则是,您希望尽可能减少数据的传递次数,并且吞吐量几乎总是与存储策略相关的带宽限制相对应

如果您的数据集超过了快速内存的大小,您可能希望以合并过程结束,而不是像其他人已经回答的那样继续基数排序

我刚刚进入GPU架构,我不理解上面的K=4评论。我还从未见过这样一个小K可以证明是最优的架构

我怀疑合并直方图也是错误的方法。我可能会让元素在内存中分割,而不是合并直方图。在GPU结构中管理中尺度散布/聚集列表有那么难吗?我当然希望不会

最后,很难想象为什么您希望在这个任务中使用多个GPU。假设您的卡有2GB内存和60GB/s写入带宽(这就是我的中端卡所显示的)。三次基数排序(11位直方图)需要6GB的写入带宽(可能是您的速率限制因素),或者大约100ms来对2GB的32位整数列表进行排序。太好了,已经分类了,现在怎么办?如果您需要在没有某种预处理或压缩的情况下将它们运送到其他任何地方,那么排序时间将很短


无论如何,今天我刚刚编译了我的第一个示例程序。还有很多东西要学。我的目标应用程序是排列密集型的,它与排序密切相关。我相信我将来会再次参与讨论这个问题

这不是外部合并排序吗?这不是外部合并排序吗?