“nvprof”结果中“GPU活动”和“API调用”之间有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“nvprof”结果中“GPU活动”和“API调用”之间有什么区别?相关的知识,希望对你有一定的参考价值。
“nvprof”结果中“GPU活动”和“API调用”之间有什么区别?
我不知道为什么同一个功能有时差。例如,[CUDA memcpy DtoH]和cuMemcpyDtoH。
所以我不知道什么是合适的时间。我必须写一个测量,但我不知道使用哪一个。
活动是针对某些特定任务的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
的“阻塞”或同步特性造成的。
以上是关于“nvprof”结果中“GPU活动”和“API调用”之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用 CUDA Profiler nvprof 进行内存访问