[新手入门] CUDA流的使用

大家有谁觉得Cuda流对于异步传输数据和计算真正起到加速效果了吗?
我反复尝试都没有什么加速效果,甚至将《GPU高性能编程CUDA实例》上的例子程序写下来运行,也没有收到他说的那种加速效果,和不使用流的结果几乎一样,是我哪里疏漏了吗?我使用的是GPU Geforce GTX480

LZ你好,cuda流确实能使不同流之间的异步传输/计算重叠,至少我是实现了,以及论坛上近期很多帖子也讨论过此问题。
针对于你的问题:
1、关于你提到的那本书,一般本论坛的态度是不提供支持。关于流更准确的用法请你参考cuda官方手册,或者风辰的中文译本。
2、由你的描述给出如下猜测:
你可能就使用了一个流;
你传输的数据可能没使用page-locked内存;
你的例子传输/内核发射书写顺序不恰当;
你传输/计算时间比悬殊,所以没感觉到;
3、由于geforce系列只有一个copy engine而且NV一再对geforce驱动进行阉割,不排除此部分功能在geforce上不好用的可能,故楼主可以考虑更换tesla系列,以获得更高性能。

谢谢回复:
我的程序里面:使用了两个流,使用了page-locked内存,顺序应该是正确的(这个我有70%的把握),传输计算时间我专门测试过了,在几乎一样的情况下修改的参数,我试试最后一种情况,在Tesla卡上试试。

对了,顺便问一下:你实现的流加速效果达到多少?比如单个流运行<?>多长时间的程序,使用流后运行多长时间?或者加速比是多少?

楼主您好,建议您使用老版本的驱动(例如2011年的)来测试geforce卡的overlap特性,

根据toolkit 5.0的release ntoes, 从5.0配套的WDDM驱动开始,将不再像以前的那样好的支持overlap传输和计算了。

您可以考虑使用Linux,或者TCC驱动,它们依然保存此能力不缩减。

谢谢你的建议,我使用的是cudaGetDeviceProperties这个函数获得GPU的属性里面有一项是deviceOverlap,得到的结果是deviceOverlap是1啊,这是不是说驱动没问题?对了,版主做个这方面流的实验吗?加速效果是否显著?我测试的程序单个流是1025.1ms,两个流是997.6ms,另外一个同学测试的流加速基本上也只是几十ms的差距,还是说需要时间更长的实验才能效果显著?

楼主您好,所有的2.x/3.x卡,都会表示这个是1的。

但这个不代表您的当前驱动能成功让来自多个流中的cudaMemcpyAsync和kernel同时执行。较新版本的WDDM驱动,可能较难取得这点。

此外,关于您询问的加速问题,您可以直接在profiler里进行观察,看看您的cudaMemcpyAsync和您的kernel是否在同时进行。
我不建议除了使用profiler观察外的任何其他的用户自己的测试时间的行为。

PS: profiler可以通过开始菜单->NVIDIA->CUDA Toolkit->Visual Profiler启动。我建议您使用这个查看是否真的同时执行了。