string - 是否有用于 GPU 的字符串数组排序算法?

标签 string sorting gpgpu gpu

要排序的数组大约有一百万个字符串,其中每个字符串的长度最多可达一百万个字符。

我正在寻找 GPU 排序算法的任何实现。

我有一个大小约为 1MB 的数据 block ,我需要构造 suffix array 。现在您可以看到如何在非常小的内存中容纳一百万个字符串。

最佳答案

GPU 排序的最新技术水平并不特别令人鼓舞。

对于 32 位整数的排序,以下 2009 年的论文(两位作者都是 Nvidia 的研究人员)仅声称 GTX280 上的最佳 CUDA 排序与 4 核 Yorkfield 上的最佳 CPU 排序相比仅提高了 23%。

http://www.mgarland.org/files/papers/gpusort-ipdps09.pdf

这在 GPU 上使用基数排序,在 CPU 上使用合并排序。您需要基于比较的排序才能构造后缀数组,因此论文中最好的方法不是 GPU 基数排序,而是 GPU 合并排序,它的速度大约是 GPU 基数排序的一半(100 万次排序)键) - 即比 CPU 合并排序慢约 40%。

添加可变长度 key 似乎可能会导致扭曲中的线程在 GPU 上不同步,因此与 CPU 相比,GPU 上的性能下降幅度更大。

总的来说,如果您的目的是构建一个高效的系统,我建议您使用 CPU 实现来解决这个问题,因为它会更快、更容易编写。

但是,如果您的目的是进行实验或只是了解 GPU,那么您可以从 CUDA SDK 中的论文中找到合并排序的 CUDA 实现:

http://developer.download.nvidia.com/compute/cuda/sdk/website/Data-Parallel_Algorithms.html

关于string - 是否有用于 GPU 的字符串数组排序算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255569/

相关文章:

python - 在 Python 中连接字符串的最有效方法

java - Java Collection.sort 错误

javascript - 如何按多个字段对对象数组进行排序?

cuda - GPU 编程、CUDA 还是 OpenCL?

cuda - NVIDIA GPU上的cuda Kernel的峰值吞吐量

c - 尝试将字符追加到字符串时出现警告 C4047 和 C4024

asp.net-mvc - ASP.NET MVC : How to covert an ActionResult to string?

c++ - 查找 C++ 中回文的数量

ios - 如何使用 swift 从 [Any] 访问 key

cuda - 1 个 CUDA 内核能否在每个时钟(麦克斯韦)处理超过 1 个浮点指令?