'nvprof'的结果中'GPU activities'和'API calls'有什么区别?

What is the difference between 'GPU activities' and 'API calls' in the results of 'nvprof'?

'GPU activities'和'API calls'在'nvprof'的结果中有什么区别?

不知道为什么同一个功能会有时间差。 例如,[CUDA memcpy DtoH] 和 cuMemcpyDtoH.

所以我不知道合适的时间是什么时候。 我要写一个测量,但我不知道该用哪个。

活动是 GPU 对某些特定任务的实际使用情况。

activity 可能是 运行 内核,或者它可能使用 GPU 硬件将数据从主机传输到设备,反之亦然。

这样一个"activity"的持续时间就是通常意义上的持续时间:这个activity什么时候开始使用GPU,什么时候停止使用GPU。

API 调用是由您的代码(或由您的代码进行的其他 CUDA API 调用)对 CUDA 驱动程序或运行时库进行的调用。

这两者当然是相关的。您可以通过某种 API 调用在 GPU 上执行 activity。这适用于数据复制和 运行 内核。

但是 "duration" 或报告的时间可能会有所不同。例如,如果我启动内核,可能有很多原因(例如,先前的 activity 在同一流中尚未完成)为什么内核不会 "immediately" 开始执行。从API的角度来看,内核"launch"可能比内核的实际运行时间长得多。

这也适用于 API 用法的其他方面。例如,cudaDeviceSynchronize() 可能需要很长时间或很短的时间,具体取决于设备上发生的情况(活动)。

通过研究 NVIDIA 视觉分析器 (nvvp) 中的时间线,您可能会更好地了解这两类报告之间的区别。

让我们以您的具体案例为例。这似乎是与驱动程序 API 相关联的应用程序,并且您显然启动了内核,并且(我猜)在内核启动后立即进行了 D->H memcpy 操作:

multifrag_query_hoisted_kernels (kernel launch - about 479ms)
cuMemcpyDtoH  (data copy D->H, about 20us)

在那种情况下,由于 CUDA 内核启动是异步的,因此主机代码将启动内核,然后继续执行下一个代码行,即 cuMemcpyDtoH 调用,即 阻止 调用。这意味着调用导致 CPU 线程在那里等待,直到前一个 CUDA activity 完成。

分析器的 activity 部分告诉我们内核持续时间约为 479 毫秒,复制持续时间约为 20 微秒(短得多)。从 activity 持续时间的角度来看,这些是相关的时间。但是,从宿主CPU线程来看,宿主CPU线程到"launch"内核所需的时间比479ms短很多,而宿主[=58= =] 线程完成对 cuMemcpyDtoH 的调用并继续执行下一行代码的时间比 20us 长得多,因为它必须在该库调用处等待,直到先前发布的内核完成。这两者都是由于 CUDA 内核启动的异步性质,以及 cuMemcpyDtoH.

的 "blocking" 或同步性质