我在GPU内存中有很多(200 000)个整数向量(每个向量中约2000个元素)。
我正在尝试并行化算法,该算法需要对每个向量进行排序,计算平均值,标准偏差和偏度。
下一步,该算法必须删除最大元素,并重复计算统计矩,直到不满足每个向量的某些标准为止。
我想问一个更有经验的人,什么是并行化此算法的最佳方法。
是否可以一次对一个以上的向量进行排序?
也许不并行化排序而是将整个算法作为一个线程进行比较好吗?
答案 0 :(得分:2)
20万个整数向量...每个向量中有2000个元素...在GPU内存中。
2,000个整数听起来像一个GPU块可以轻松解决的问题。它们将适合它的共享内存(或它的寄存器文件,但是由于各种原因,它的用处不大),因此您不需要在全局内存中对它们进行排序。 200,000个矢量= 200,000个块;但您不能有2000个阻塞线程-过多
您可以按照@talonmies的建议使用cub的block radix sort,但我不太确定这是正确的做法。您也许可以用力地做到这一点,但是也很有可能会产生很多开销和复杂的代码(尽管我可能是错的)。认真考虑改编现有的(双子级的)排序内核,甚至编写自己的内核-尽管要正确使用它更具挑战性。
无论如何,如果您编写自己的内核,则可以在对数据进行排序之后对“下一步”进行编码。
也许不并行化排序而是将整个算法作为一个线程进行比较好吗?
这取决于您的应用程序当前在这些排序工作上花费的时间(相对于整个运行时间)。有关上述内容的更正式声明,另请参见Amdahl's Law。话虽如此-当GPU内存中已有数据时,通常应该使排序并行化。