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

问题描述 投票:1回答:1

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

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

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

enter image description here

c++ cuda nvprof
1个回答
3
投票

活动是针对某些特定任务的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的“阻塞”或同步特性造成的。

© www.soinside.com 2019 - 2024. All rights reserved.