tha*_*los 0 concurrency cuda cuda-streams
关于Cuda流处理多个内核的几个问题.在具有3.5个功能的kepler设备中假设s流和内核,其中s <= 32.内核使用大小为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的图像.它显示了流的分析器输出.. !!!
内核之间的并发性取决于许多因素,但许多人忽略的只是内核的大小(即网格中的块数).大小可以自己有效利用GPU的内核通常不会在很大程度上同时运行,即使他们这样做,也几乎没有吞吐量优势.GPU内部的工作分配器通常会在内核启动后立即开始分配块,因此如果一个内核在另一个内核之前启动,并且两者都有大量的块,那么第一个内核通常会占用GPU,直到它接近完成后,第二个内核的块将被调度和执行,可能只有少量的"并发重叠".
主要的一点是,具有足够"块填充GPU"的块的内核将阻止其他内核实际执行,除了调度之外,这在计算机3.5设备上没有任何不同.此外,不仅仅为内核指定一些参数作为一个整体,而且在块级别指定启动参数和统计信息(例如寄存器使用,共享内存使用情况等)有助于提供清晰的答案.计算3.5架构在这个领域的好处仍然主要来自"少量"块的"小"内核,试图一起执行.Compute 3.5在那里有一些优势.
您还应该查看此问题的答案.
同样,如果你有合理大小的内核(数百或数千个块或更多),那么工作分配器对块的调度很可能是内核之间并发量的主要因素.
编辑:回应问题中发布的新信息.我看过kF.png
无论如何,我认为上面的分析1和2清楚地表明,基于内核结构中固有的限制,您可以从设备中获得大部分功能.(我们可以根据寄存器进行类似的分析,以发现这是否是一个重要的限制因素.)关于这句话:"我真的不明白为什么我没有实现相当于gk110s指定的并发..."我希望你看到并发规范(例如32个内核)是最大规范,并且在大多数情况下,在达到可以同时执行的最大内核数量限制之前,您将遇到其他类型的机器限制.
编辑:关于文档和资源,我从上面链接到Greg Smith的答案提供了一些资源链接.这里还有一些: