由于GPU上的一些初始化工作,第一个cudaMalloc调用很慢(如0.2秒)。是否有任何单独进行初始化的功能,以便我可以分开时间? cudaSetDevice似乎将时间缩短到0.15秒,但仍然没有消除所有init开销。
答案 0 :(得分:25)
致电
cudaFree(0);
是在CUDA运行时强制延迟上下文建立的规范方法。您无法减少开销,这是驱动程序,运行时和操作系统延迟的函数。但是上面的调用可以让你控制程序执行期间这些开销的发生方式/时间。
2015年编辑,补充说,运行时API中的上下文初始化的启发式随着时间的推移发生了微妙的变化,因此cudaSetDevice
现在建立了一个上下文,因此cudaFree()
调用没有明确要求初始化上下文,您可以使用cudaSetDevice
代替。另请注意,在第一次内核启动时仍会产生一些设置时间,而在此之前并非如此。对于内核计时,最好在启动内核之前首先包括预热调用,您将有时间消除此设置延迟。看起来各种分析工具都具有足够的粒度,以避免在没有任何额外的API调用或内核调用的情况下进行此操作。