16

由于 GPU 上的一些初始化工作,第一个 cudaMalloc 调用很慢(如 0.2 秒)。有没有只做初始化的函数,这样我就可以分开时间了?cudaSetDevice 似乎将时间减少到 0.15 秒,但仍不能消除所有初始化开销。

4

1 回答 1

25

打电话给

cudaFree(0);

是在 CUDA 运行时强制建立惰性上下文的规范方法。您无法减少开销,这是驱动程序、运行时和操作系统延迟的函数。但是上面的调用将让您控制这些开销在程序执行期间如何/何时发生。

编辑在 2015年添加,运行时 API 中的上下文初始化启发式随着时间的推移发生了微妙的变化,因此cudaSetDevice现在建立了一个上下文,因此cudaFree()不需要显式调用来初始化上下文,您可以使用它cudaSetDevice。另请注意,在第一次内核启动时仍会产生一些设置时间,而在此之前情况并非如此。对于内核时序,最好在启动内核之前先包含一个预热调用,您将有时间消除此设置延迟。似乎各种分析工具都内置了足够的粒度来避免这种情况,而无需任何额外的 API 调用或内核调用。

于 2013-03-01T21:03:58.027 回答