我要求一个c ++库进行GPU加速排序(大约1GB的数据)和合并排序(比如大约100GB的数据 - 但大小无关紧要,因为merge是一种流算法)。许可证必须是LGPL,BSD或类似的。由于可移植性,我非常喜欢OpenCL(但我也对CUDA库的链接感兴趣)。我很欣赏有关此主题的论文和博客文章的链接。
1路的2路合并排序(即128,000 000个8字节实体)将消耗大约log 2 (128 000 000)·1G = 27GB的内存带宽,即在现代CPU上大约1秒钟,顺序内存带宽约为30GB / s。 (任何非合并排序似乎需要更长的时间,因为非顺序内存访问速度在10-100次之内)。
虽然我不熟悉现代GPU,但我怀疑1GB的合并类型需要0.2秒甚至更少,因为典型的GPU内存带宽约为150GB / s,如AMD / ATI 58xx(例如参见{{ 3}})
这至少是加速的5倍。 (在16x PCI-E 2.0上传输1GB的时间约为0.125秒,但似乎可以将PCI传输与排序并行;但是,这可能需要2GB或3GB的视频卡内存而不是1GB)。
我怀疑由于超过双向合并排序或某种类型而适用于GPU的速度更快。
答案 0 :(得分:3)
你看过Thrust吗?
从项目页面:
Thrust是一个类似于C ++的并行算法库 标准模板库(STL)。 Thrust的高级界面非常棒 在提高性能可移植性的同时提高开发人员 在GPU和多核CPU之间。与已建立的互操作性 技术(如CUDA,TBB和OpenMP)有助于集成 使用现有软件。快速开发高性能应用程序 与推力!
许可证是Apache,所以它应该适合你。