1

我做了一个应用程序

在此报告文件中:

1.

当我在下拉列表中选择“CUDA -> CUDA 摘要”时

在表中的Runtime API 调用项下

时间百分比- 80.66

发射

%设备时间- 15.46

所有其他时间百分比几乎为 0%

所以我的问题是,剩下的 19.34% 的时间和 84.54% 的设备时间在哪里?也就是说,如果它们表示完全不同的“总时间”值的百分比?

2.

我使用推力向量来回复制我的数据。在本报告的“内存副本”部分,我运行的备忘录副本的所有 % Time 值显然可以忽略不计。

但是你猜怎么着,当我点击运行时 API 调用的“摘要”链接(它的 % Time 值高达 80.66)时,我立即看到罪魁祸首 - 'cudaMemcpy' 和它的 'Capture Time %' 值一样高在此“运行时 API 调用摘要”页面中为 73.75 。

所以我的问题是

  • 这是否意味着我的瓶颈仍然是那些对推力::复制()的调用,甚至报告的“备忘录副本”部分也没有显示它?
  • 我怎样才能真正找到对我来说最昂贵的确切函数调用?
  • 时间线功能如何帮助解决这些问题?
4

1 回答 1

3

CUDA 总结

在 CUDA 摘要中,运行时 API 调用下的时间百分比是 CUDA 运行时占用的 CPU 时间百分比。我不记得 % 是否限制为 100%(所有 CPU 线程都已展平),或者最大 % 是否为 NumCpuCores * 100%。

API 调用

为了找到最昂贵的运行时 API 调用,请执行以下步骤:

  1. 导航到页面CUDA 运行时 API 调用
  2. 单击 Duration 列 2 次以降序排序

可以捕获 CUDA 运行时 API 调用的调用堆栈,以便您可以从报告中跳转到源代码。这可以通过以下步骤在 Activity 中启用:

  1. 导航到 Activity 中的跟踪设置
  2. 启用系统跟踪
  3. 展开 CUDA 跟踪设置
  4. 启用运行时 API 跟踪和调用堆栈跟踪 = 始终

警告:将调用堆栈跟踪设置为始终会增加 API 调用开销。仅当程序受 CPU 限制并且您尝试识别生成 API 调用的源代码时才启用此功能。

可以使用报告页面左下角的关联窗格从引用 API 调用的报告页面访问调用堆栈跟踪。下面的屏幕截图显示了 CUDA 运行时 API 调用报告页面中 cudaEventSynchronize 调用的调用堆栈。

Nsight VSE CUDA 运行时 API 调用报告页面

可以使用 Process\Thread\Function Calls 或 Process\CUDA\CUDA Context\Runtime API 行的相关信息在 Timeline 报告页面中查询最长的 API 调用。

  1. 单击包含 API 调用的行
  2. 在相关树中单击行信息\运行时 API
  3. 在 API 调用表中,单击 Duration 列 2 次并将表滚动到顶部。
  4. 单击 API 调用以将时间线视图导航到 API 调用。

此时也可以使用关联窗格检索调用堆栈。

在此处输入图像描述

于 2013-04-29T21:26:43.233 回答