关于多内核的Cuda流处理的一些问题。 假设在具有3.5的kepler设备中的流和内核,其中s <= 32。 kernel使用大小为n的dev_input数组和大小为s * n的dev输出数组。 内核从输入数组中读取数据,将其值存储在寄存器中,对其进行操作并将其结果写回位于s * n + tid的dev_output。
我们的目标是每次使用n个流中的一个来运行相同的内核。与simpleHyperQ示例类似。你能否评论以下任何一项是否以及如何影响并发?
任何好评都将不胜感激...... !!!
欢呼声, Thanasio
罗伯特, 非常感谢您的详细解答。这非常有帮助。我编辑了4,每块10kb。所以在我的情况下,我发布了61个块和256个线程的网格。内核受计算限制。我启动了8个相同内核的流。描述它们然后我看到前两个之间非常好的重叠然后它变得越来越糟。内核执行时间约为6ms。在前两个流执行几乎完全并发后,其余的流之间的距离为3ms。关于5,我使用具有255寄存器文件的K20。所以我不希望那里有弊端。我真的不明白为什么我没有实现相当于gk110s指定的并发...
请查看以下链接。有一个名为kF.png的图像。它显示了流的探查器输出.. !!!
答案 0 :(得分:6)
内核之间的并发性取决于许多因素,但许多人忽略的只是内核的大小(即网格中的块数)。内核的大小可以自己有效地利用GPU通常不会在很大程度上同时运行,即使它们确实存在吞吐量优势。 GPU内部的工作分配器通常会在内核启动后立即开始分发块,因此如果一个内核在另一个内核之前启动,并且两者都有大量的块,那么第一个内核通常会占用GPU,直到它接近完成后,第二个内核的块将被调度和执行,可能会有少量的&#34;并发重叠&#34;。
重点是内核有足够的块来填充GPU&#34;将阻止其他内核实际执行,除了调度,这在计算3.5设备上没有任何不同。此外,不仅仅为内核指定一些参数作为一个整体,而且在块级别指定启动参数和统计信息(例如寄存器使用,共享内存使用等)有助于提供清晰的答案。计算3.5架构在这个领域的优势仍然主要来自&#34; small&#34; &#34;少数&#34;的内核块,试图一起执行。 Compute 3.5在那里有一些优势。
您还应该查看this question的答案。
同样,如果您有合理大小的内核(数百或数千个块或更多),那么工作分配器对块的调度很可能是内核之间并发量的主要因素。
编辑:以回应问题中发布的新信息。我看过kF.png
无论如何,我认为上面的分析1和2清楚地表明,基于内核结构中固有的限制,您可以从设备中获得大部分功能。 (我们可以根据寄存器进行类似的分析,以发现这是否是一个重要的限制因素。)关于这个声明:&#34;我真的不明白为什么我没有达到与gk110s指定的相同的并发...&# 34;我希望您看到并发规范(例如32个内核)是最大规范,并且在大多数情况下,在达到最大数量限制之前,您将遇到其他类型的机器限制可以同时执行的内核。
关于文档和资源的编辑:,我从Greg Smith上面链接的答案提供了一些资源链接。以下是其他一些内容:
答案 1 :(得分:0)
到目前为止,我对HyperQ的经验是我的内核并行化的2-3(3.5)次,因为对于更复杂的计算,内核通常更大。对于小内核来说,它是一个不同的故事,但通常内核更复杂。
Nvidia在他们的cuda 5.0文档中也回答了这一问题,即更复杂的内核将减少并行化的数量。
但是,GK110仍然有很大的优势,只允许这样做。