我编写了一个CUDA程序,与串行版本40(2600k vs GTX 780)相比,它已经获得了加速。现在我正在考虑使用几个流来并行运行几个内核。现在我的问题是:我如何测量GPU上的免费资源(因为如果我的GPU上没有免费资源,使用流就没有意义,我是对的吗?),在这种情况下使用流有意义吗?
如果被问到我当然可以提供我的代码,但目前我认为这个问题不需要。
答案 0 :(得分:3)
只有在资源可用的情况下才会同时运行内核。单个内核调用“用完”GPU将阻止其他内核以有意义的方式执行,正如您已经指出的那样,直到内核完成执行。
最初考虑的关键资源是SM,寄存器,共享内存和线程。其中大部分也与占用有关,因此研究现有内核的占用率(理论值,即占用率计算器以及测量值)将为您提供良好的整体视图,以便通过并发获得额外收益内核。
在我看来,如果要启动大量非常小的内核,即只包含一个或少量线程块的内核,并且内核非常有限,并发内核只能在您的应用程序中显示出很大的整体优势。使用共享内存,寄存器和其他资源。
最佳优化方法(在我看来)是分析驱动的优化。这往往会避免过早或可能误导的优化策略,例如“我听说过并发内核,我想知道我是否可以使用它运行得更快?”分析驱动的优化首先要求使用基本的利用率问题,使用分析器来回答这些问题,然后将优化工作集中在改进度量标准上,例如内存利用率或计算利用率。并发内核或其他各种技术是您可以用来解析代码分析结果的一些策略。
您可以使用this one等演示文稿开始使用分析驱动的优化。
答案 1 :(得分:-1)
如果未指定流,则使用流0。 According to wikipedia(您也可以在cudaDeviceProp structure中找到它),您的GTX 780 GPU有12个流式多处理器,这意味着如果您使用多个流可能会有所改进。 asyncEngineCount属性将告诉您可以运行多少并发异步内存副本。
使用流的想法是使用asyncmemcopy引擎(又名DMA引擎)来重叠内核执行和device2host传输。您应该使用的流数量以获得最佳性能很难猜测,因为它取决于您拥有的DMA引擎数量,SM数量以及同步/并发数量之间的平衡。为了得到一个想法,你可以阅读this presentation(例如幻灯片5,6很好地解释了这个想法)。
编辑:我同意第一步需要使用分析器。