Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String GPU是否有对字符串数组进行排序的算法?_String_Sorting_Gpgpu_Gpu - Fatal编程技术网

String GPU是否有对字符串数组进行排序的算法?

String GPU是否有对字符串数组进行排序的算法?,string,sorting,gpgpu,gpu,String,Sorting,Gpgpu,Gpu,要排序的数组大约有一百万个字符串,其中每个字符串的长度最多可达一百万个字符 我正在寻找任何GPU排序算法的实现 我有一个大约1MB大小的数据块,我需要构造。现在,您可以看到如何在非常小的内存量内拥有一百万个字符串。GPU排序的最新技术并不特别令人鼓舞 对于32位整数的排序,以下2009年的论文(两位作者是Nvidia的研究人员)仅声称GTX280上的最佳CUDA排序比4核Yorkfield上的最佳CPU排序增加了23% 这在GPU上使用基数排序,在CPU上使用合并排序。为了构造后缀数组,您需要

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

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


我有一个大约1MB大小的数据块,我需要构造。现在,您可以看到如何在非常小的内存量内拥有一百万个字符串。

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

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

这在GPU上使用基数排序,在CPU上使用合并排序。为了构造后缀数组,您需要一个基于比较的排序,因此本文中最好的是GPU合并排序,而不是GPU基数排序,它的速度大约是GPU基数排序的一半(有一百万个键)——即比CPU合并排序慢40%

添加可变长度键似乎可能会导致扭曲中的线程在GPU上失去同步,因此会比CPU更降低GPU上的性能

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

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


1M
每个字符串的字符数(平均
.5M
?),
1M
字符串,2字节/字符(最常见)产生:
.5*1*2=1TB
内存。你需要一些特别的东西(也许是数据库?),因为很少有机器有这种内存,更不用说GPU内存了。最大字符串长度与平均值无关。我假设字符串已经在内存中并正在排序,但是海报对任务的CPU性能不满意。了解数据的结构可能是相关的/有用的。它是由
\0
分隔的一组连续字符串吗?字符串前面是否有保存字节计数的头?或者堆中是否有指针数组?我们谈论的是ASCII字符串还是Unicode?看看我问题的更新版本。CUDA的全部目的不是使用空闲的处理器吗?即使GPU在CPU上没有任何速度提升,只要你能有效地利用额外的并行性,你的速度也会比单用CPU提高2倍。@Robert Harvey-CUDA的大多数使用不会让CPU同时忙碌。然而,最近这种情况变得越来越普遍,通常被称为混合GPU/CPU。但是,需要在CPU和GPU内存之间进行复制,这使得获得良好的性能变得非常困难。在这种情况下,我希望你最多能达到CPU速度的150%,最好投资一个有两个CPU的系统。谢谢你的回答。我同意你关于在GPU上对字符串进行排序的所有注释,我也这么认为,但我希望有一个我错过的算法。