C++ ';GPU活动';和';API调用';在';nvprof';?

C++ ';GPU活动';和';API调用';在';nvprof';?,c++,cuda,nvprof,C++,Cuda,Nvprof,在“nvprof”的结果中,“GPU活动”和“API调用”之间有什么区别 我不知道为什么在同一个函数中会有时差。 例如,[CUDA memcpy DtoH]和cumencpydtoh 所以我不知道什么时候合适。 我必须写一个测量值,但我不知道该用哪一个 活动是GPU在某些特定任务中的实际使用 一个活动可能正在运行内核,或者可能正在使用GPU硬件将数据从主机传输到设备,反之亦然 这种“活动”的持续时间是通常意义上的持续时间:该活动何时开始使用GPU,何时停止使用GPU API调用是由您的代码(或由

在“nvprof”的结果中,“GPU活动”和“API调用”之间有什么区别

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

所以我不知道什么时候合适。 我必须写一个测量值,但我不知道该用哪一个


活动是GPU在某些特定任务中的实际使用

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

这种“活动”的持续时间是通常意义上的持续时间:该活动何时开始使用GPU,何时停止使用GPU

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

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

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

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

<> P>你可以通过研究英伟达视觉分析器(NVVP)的时间线来更好地了解这两类报告的差异。 让我们以您的具体案例为例。这似乎是一个与驱动程序API相关联的应用程序,很明显,在内核启动之后,您立即启动了一个内核和(我猜)一个D->H memcpy操作:

multifrag_query_hoisted_kernels (kernel launch - about 479ms)
cuMemcpyDtoH  (data copy D->H, about 20us)
在这种情况下,因为CUDA内核启动是异步的,所以主机代码将启动内核,然后它将进入下一个代码行,这是一个
cuMemcpyDtoH
调用,这是一个阻塞调用。这意味着调用会导致CPU线程在那里等待,直到上一个CUDA活动完成

探查器的活动部分告诉我们内核持续时间约为479ms,复制持续时间约为20us(要短得多)。从活动持续时间的角度来看,这些时间是相关的。但是,从主机CPU线程来看,主机CPU线程“启动”内核所需的时间比479ms短得多,主机CPU线程完成对
cuMemcpyDtoH
的调用并继续下一行代码所需的时间比20us长得多,因为它必须在库调用时在那里等待,直到之前发布的内核完成。这两者都是由于CUDA内核启动的异步性质,以及
cuMemcpyDtoH
的“阻塞”或同步性质