cudaError是否影响时间问题

我在思考一个问题,像下面的代码,加入了查错提示if(cudaStat!=cudaSuccess)这个if分支后,会不会影响运算时间啊?我试验过好像没有什么影响,希望给个建议!

cudaStat=cudaMalloc((void**)&dev_A,sizeInput);
if(cudaStat!=cudaSuccess)
{
printf(“device A memory allocation failure!”);
return EXIT_FAILURE;
}
cudaStat=cudaMalloc((void**)&dev_B,sizeInput);
if(cudaStat!=cudaSuccess)
{
printf(“device B memory allocation failure!”);
return EXIT_FAILURE;
}
cudaStat=cudaMalloc((void**)&dev_C,sizeOutput);
if(cudaStat!=cudaSuccess)
{
printf(“device C memory allocation failure!”);
return EXIT_FAILURE;
}

放心吧,没有任何影响。

如果不是在内核函数的最内层循环处,这种问题就无需考虑。

我建议楼主无视吧。

你有2个选择:
(1)从不在host code里检查错误. 您可以一直黑算下去。无论中间是否出错。
(2)在host code里检查错误。从而能及时的尽早发现。

因为这个问题是无可避免的,所以您必须去检查(2)。所以哪怕占用时间,楼主您也只能默默忍受。

那么究竟会影响时间么?实际上没事。

(a)您的一段普通的host code生成的代码流里,您能看到的(if之类的)带来的跳转,比起您看不到的,而编译器生成的跳转,要少的多(例如您的任何一个函数调用的代价就远远超过了您的if)。
所以请不要顾虑。
如同您上班,今天BOSS为您的火,比起来BOSS实际上每天发的火,要少的多。所以无需整天担心公司是否因为今天您让BOSS发火了,而影响公司的运转效率。

(b)您的代码不是100%出错的。您一段调试好的代码,一般出错的概率很低,这些if, 大部分情况都不会在运行的时候产生实际跳转。代码流还是一往直前的执行的。请无需担心。

(c)因为您的判断是在host上的,而现代的CPU对于一个判断+跳转(例如cmp …, jne…)的指令组合,轻松的很,游刃有余。例如SNB之类的CPU架构,可以快速的专门处理这种组合(intel的macro fusion的广_告不便在此发出,您有兴趣可以私下搜索验证我的说法). 所以CPU认为这一点都不为难。

既然(1)您用不用if判断返回值都基本不会影响您的代码里实际的判断,跳转指令数; (2)这些对CUDA API调用产生的返回值判断而导致跳转实际上大部分都不会发生。(3)您的CPU表示它无所谓。

所以可以得出结论:楼主您也无需担心。或者说您可以认为无影响。

我建议楼主依然继续检查。这不是一个可以优化掉的“好习惯”。而是选择必须接受的的。如同您的生活,一些事情,无法逃避,那就默默的接受吧。:frowning:

感谢您的来访。
祝您工作、学习愉快!

楼主你好!所谓的分支对CUDA程序的影响不是在HOST端,而是在DEVICE端。你这段代码是在HOST端的,其实就是CPU做了分支处理,并不是GPU在做分支,当然不会有任何影响。

顺便提一下分支为什么会影响到GPU执行,GPU是以WARP为基本的调度单位,一个WARP有32个线程,这32个线程在同一个周期内执行的是相同的指令。假如这32个线程现在要做32件不同的工作,那么糟糕的情况就出现了,CUDA就至少需要32个周期为这32件工作取不同的指令执行,这就是为什么分支会影响性能的原因了!

1:代横扫千军版主修复4#笔误一处。

2:LZ所述情况是host端的,并不影响device端的运行。同时host端效率的影响根据4#的详细解答,是可以忽略的,也就是说实际上没什么影响。同时,这是一个编写,调试程序的好习惯,推荐如此。

3:关于device端的分支问题(实际与楼主问题无关,不过这里作为扩展内容补充)
可以参考本版帖子

http://cudazone.nvidia.cn/forum/ … 5963&extra=page%3D1

欢迎LZ莅临cudazone!
祝楼主编码愉快!

好的。知道了。

谢谢耐心回答,那我就可以放心的在HOST端用查错的语句了~

嗯,起初我是这么想的,即使是在HOST端,毕竟多了一些if判断语句,每次调用这个模块都要多执行这么多的if语句,我想这样可能也会影响执行的速度。现在清楚了,非常感谢!

嗯,好的,非常感谢!