我要求一个 c++ 库来进行 GPU 加速排序(大约 1GB 的数据)和合并排序(例如,大约 100GB 的数据——但大小并不重要,因为合并是一种流算法)。许可证必须是 LGPL、BSD 或类似的。由于可移植性,我非常喜欢 OpenCL(但我也对指向 CUDA 库的链接感兴趣)。我很欣赏有关此主题的论文和博客文章的链接。
一些背景(如果我错了请纠正我):
1GB 的 2 路合并排序(即 128 000 000 个 8 字节实体)将消耗大约 log 2 (128 000 000)·1G = 27GB 的内存带宽,这在具有顺序内存带宽的现代 CPU 上约为 1 秒约 30GB/秒。(任何非合并排序似乎都需要更长的时间,因为非顺序内存访问速度要慢 10-100 倍)。
虽然我不熟悉现代 GPU,但我怀疑 1GB 的合并排序将花费 0.2 秒甚至更少,因为典型的 GPU 内存带宽约为 150GB/s,如 AMD/ATI 58xx(参见,例如http://en .wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units#Evergreen_.28HD_5xxx.29_series)
这至少是 5 倍的加速。(通过 16x PCI-E 2.0 传输 1GB 的时间约为 0.125 秒,但似乎可以在排序的同时进行 PCI 传输;但是,这可能需要 2GB 或 3GB 的视频卡内存而不是 1GB)。
我怀疑由于多于 2 路合并排序或某种适用于 GPU 的排序,速度会更快。