2016-06-08 145 views
0

我从头创建了CUDA的扫描算法,并尝试将其用于小于80,000字节的较小数据量。内核调用CUDA上的流延迟

创建了两个单独的实例,其中一个在可能的情况下使用流运行内核,另一个只在默认流中运行。

我观察到的是,对于这个数据大小范围,与其他方法相比,运行流需要更长的时间来完成任务。

当使用nvprofiler分析,什么观察到的是,对数据大小较小的量,在数据流上运行将不会单独kernals

提供并行没有流 Scan Without Streams

随着流 Scan With Streams

但是当数据大小增加时,某种并行性可能是ob tained

随着流为400,000bytes With Streams for 400,000

我的问题是,是否有一些额外的参数,以减少这个内核调用时间延迟或者是正常的,有这种更小的数据大小的行为,其中使用流是不利的

UPDATE:

我已经包括了运行时API调用的时间表,以及明确的答案

With Streams with the Runtime API

回答

2

一般来说你的数据太小,无法充分利用你的第一种情况下的GPU。如果您在nvvp中查看'运行时API'的时间线,而您没有在图中显示,则会发现启动一个内核需要几微秒。如果流13中的第一个内核太短,流14中的第二个内核可能还没有启动,因此跨流没有并行性。

由于这些开销,如果数据很小,您可能会发现在CPU上运行程序甚至更快。

+0

这就是我所怀疑的。仍然从时间线上我可以看到第二个内核的cudaLaunch API调用在第一个内核的执行结束之前结束。因此技术上仍然可以在第一个内核完成之前运行第二个内核。我希望是否有可能将API cudaLaunch时间缩短到实际的内核执行时间。但我认为,正如你所提到的,这个启动时间对于执行时间来说是相当高的,因为数据量很小 而你在CPU数据量较低的情况下胜过GPU的事实是正确的。谢谢 – BAdhi