0

我想知道是否可以编写一个持久的 GPU 函数。我有疑问,但我不确定调度程序是如何工作的。

我正在寻找处理未知数量的数据点(大约 5000 万)。数据以 20 块左右的形式到达。如果我可以将这 20 个点放入 GPU“桶”中,并让这个“持久”操作在它们进入时抓取并处理它们,那就太好了。完成后,抓取结果。
当存储桶为空时,我可以让 GPU 忙于处理虚拟数据。但我认为部分空桶的竞争条件将是一个问题。
我怀疑当这个持久性操作正在运行时,我将无法在 GPU 上运行任何其他操作。即让其他不敬业的SM 工作。

这是一种可行的(费米)GPU 方法,还是只是一个坏主意?

4

1 回答 1

1

我不确定这个持久内核是否可行,但它肯定会非常低效。尽管这个想法很优雅,但它不适合 GPU:您必须全局通信哪个线程从桶中挑选哪个元素,一些线程甚至可能永远不会启动,因为它们等待其他线程完成并且桶必须是声明为 volatile ,因此会减慢您的整个输入数据。

解决您的问题的一个更常见的解决方案是将数据分成块并将这些块异步复制到 GPU 上。您将使用两个流,一个处理最后发送的块,另一个从主机发送一个新块。这实际上将同时进行。这样,您可能会隐藏大部分传输。但是不要让块变得太小,否则您的内核将遭受低占用率和性能下降。

于 2013-02-08T18:34:33.763 回答