gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:40:29 25 4
gpt4 key购买 nike

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

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

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

enter image description here

最佳答案

事件是 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 call,这是一个阻塞调用。这意味着调用会导致 CPU 线程在那里等待,直到前一个 CUDA 事件完成。

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

关于c++ - 'GPU activities' 和 'API calls' 在 'nvprof' 的结果中有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55574096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com