4

“nvprof”的结果中的“GPU 活动”和“API 调用”有什么区别?

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

所以我不知道什么是正确的时间。我必须写一个测量值,但我不知道该使用哪个。

在此处输入图像描述

4

1 回答 1

5

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

一个活动可能正在运行一个内核,或者它可能正在使用 GPU 硬件将数据从主机传输到设备,反之亦然。

这种“活动”的持续时间是通常意义上的持续时间:这个活动什么时候开始使用 GPU,什么时候停止使用 GPU。

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

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

但是,“持续时间”或报告的时间可能有所不同。例如,如果我启动一个内核,可能有很多原因(例如,在同一流中尚未完成的先前活动)为什么内核没有“立即”开始执行。从 API 的角度来看,内核“启动”可能比内核的实际运行时持续时间长得多。

这也适用于 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 活动完成。

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

于 2019-04-08T13:18:52.817 回答