许多但很小的阵列在GPU上合并

时间:2014-04-28 21:50:09

标签: parallel-processing gpgpu

我有以下形式的二维数据结构:

{{t1,1;...;t1,500}, ..., {t31,1; ...;t31,500}}

因此每个数据结构大约有15.000个项目。 (范围1-500可以变化很大,仅是指示性的,31是固定的)。我每100毫秒获得2000个这些数据结构并代表测量数据。

tx,x表示简单的整数。保证例如t1,1 < t1,2等;但一般来说不是t1,1 < t2,1

我们希望将所有tx,x合并为每个2000个2D结构的(有序!)1D结构。

现在我们目前有一个相当快速的顺序CPU合并算法,但我们正在尝试查看GPGPU的可能性,现在15.000项可能不值得开销,我可以用初始opencl排序算法确认。然而,是否有直接的策略来提升在1个数据集上运行的GPGPU内核,在这个上下文中是一个2d数据结构,以便在2000个数据集上并行运行?为了充分利用GPU?

我已经阅读了有关并发内核的内容,但这只允许在当前平台上最多4-16个并发内核。并发内核也是一个通用解决方案,因为它们允许不同类型的内核,而在这种情况下,我们需要在2000多个数据结构上完成相同的内核,如SKMD,单内核多数据(* ),但是我不知道这个级别上的并行性还是我真的错过了在这种情况下充分利用GPU的一些明显的东西?

我非常渴望得到任何帮助,因此欢迎基于专有或开放标准的建议。

(*)是的,我提出了一个想法,希望

1 个答案:

答案 0 :(得分:0)

回答自己的问题:

所以在GPU术语中,做了很多但是同样的任务&#39; x&#39;被称为分段&#39; x&#39; *),在这种情况下,我会喜欢分段合并。到目前为止,没有生产就绪的算法,因此我将使用分段排序,仍然非常快,但我抛出了内部数组已经排序的事实,但我现在可以做2000个数据集平行。

另一种选择是使用localitySort,它确实利用了已经排序的区域这一事实,但是提升这个功能以便操作超过2000个项目暂时不能用于我,可能是前后处理和使用localitySort over keys和!值(也可用)将产生结果。

*)在看了关于GPU编程的非常有用的udacity讲座之后,这些信息得到了我。