[英]Cuda Stream Processing for multiple kernels Disambiguation
您好,一些有关多个内核的Cuda流处理的问题。 假设s流和具有3.5功能的开普勒设备中的内核,其中s <=32。内核使用大小为n的dev_input数组和大小为s * n的dev输出数组。 内核从输入数组中读取数据,将其值存储在寄存器中,对其进行操作,然后将其结果写回到s * n + tid处的dev_output中。
我们的目标是每次使用n个流之一运行相同的内核s次。 与simpleHyperQ示例相似。 您能否评论以下任何一项以及如何影响并发?
任何好的评论将不胜感激... !!!
干杯,塔纳西奥
罗伯特,非常感谢您的详细回答。 这非常有帮助。 我编辑了4,每个块10kb。 因此,在我的情况下,我启动了包含61个块和256个线程的网格。 内核相当受计算约束。 我启动了8个相同内核的流。 剖析它们,然后我发现前两个之间有很好的重叠,然后变得越来越糟。 内核执行时间约为6ms。 前两个流几乎完全并发执行后,其余两个流之间的距离为3ms。 关于5,我使用的K20具有255个寄存器文件。 因此,我不会期望那里有弊端。 我真的不明白为什么我无法实现与gk110s所指定的并发性。
请查看以下链接。 有一个名为kF.png的图像,它显示了流的探查器输出.. !!!
内核之间的并发性取决于许多因素,但是许多人忽略的一个因素仅仅是内核的大小(即网格中的块数)。具有可以自行有效利用GPU的大小的内核通常不会在很大程度上并发运行,即使这样做,吞吐量优势也很小。 GPU内的工作分配器通常会在启动内核后立即开始分配块,因此,如果一个内核先于另一个内核启动,并且两个内核都有大量块,则第一个内核通常会占据GPU,直到将近完成后,第二内核的块将被调度并执行,可能会有少量“并发重叠”。
主要要点是,具有足够块以“填充GPU”的内核将阻止其他内核实际执行,并且除了调度之外,这在计算3.5设备上也没有任何不同。 此外,在块级别指定启动参数和统计信息(例如寄存器使用率,共享内存使用率等),不只是为整个内核指定几个参数,还有助于提供清晰的答案。 在此领域中,compute 3.5体系结构的优势仍将主要来自“少量”块的“小”内核,它们试图一起执行。 计算3.5在此具有一些优势。
您还应该查看该问题的答案。
同样,如果您具有合理大小的内核(数百个或数千个块或更多),则工作分配器对块的调度很可能将成为内核之间并发量的主要因素。
编辑:响应问题中发布的新信息。 我看了kF.png
无论如何,我认为上面的分析1和2清楚地表明,基于内核结构固有的限制,您将从设备中获得了大部分功能。 (我们可以基于寄存器进行类似的分析,以发现这是否是一个重要的限制因素。)关于此声明:“我真的不明白为什么我没有实现与gk110s所指定的并发等效的原因。”我希望您能看到并发规范(例如32个内核)是最大规范,并且在大多数情况下,在达到可以同时执行的最大内核数量限制之前,您将遇到其他某种计算机限制。
编辑:关于文档和资源,我从格雷格·史密斯上面链接到的答案提供了一些资源链接。 这里还有一些:
到目前为止,我对HyperQ的经验是内核并行化的2-3(3.5)倍,因为对于一些更复杂的计算,内核通常更大。 对于小内核,情况则不同,但通常内核会更复杂。
Nvidia在其cuda 5.0文档中也回答了这一问题,即更复杂的内核将减少并行化的数量。
但是,GK110仍然具有很大的优势。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.