# 九、Nsight

本章主要与使用 Visual Studio Professional 的读者相关。Nsight 调试器是从 NVIDIA 网站免费下载的。不幸的是，Visual Studio 的快速版本不允许安装像 Nsight 这样的扩展。

如果您正在使用 Visual Studio 的 Express 版本，本章可能仍然会提供一些关于设备工作原理的见解，但是您将无法理解我提供的示例。

Nsight 调试器对于调试像 DirectX 和 OpenGL 这样的图形应用程序接口以及计算应用程序接口非常有用。调试器可从以下网站获得:

[https://developer . NVIDIA . com/NVIDIA-n right-visual studio-edition](https://developer.nvidia.com/nvidia-nsight-visual-studio-edition)

要从上一个链接下载 Nsight，您需要注册为 NVIDIA 开发人员并登录您的帐户。要注册为 CUDA 开发人员，请访问以下网站:

[https://developer.nvidia.com/programs/cuda/register](https://developer.nvidia.com/programs/cuda/register)

Nsight 的注册和下载程序会随着时间的推移而变化，在允许您访问 Nsight 调试器下载之前，您可能需要向 NVIDIA 的工作人员提供更多详细信息。

下载带有自动安装程序，因此要将扩展名添加到 Visual Studio 中，只需双击下载的文件。一旦安装了 Nsight，您应该能够运行 Visual Studio Professional 并在菜单栏中看到 Nsight 选项。

## 生成分析报告

Nsight 可以生成非常详细的报告，包括探查器(NVVP)生成的所有信息以及更多信息。从菜单栏中选择**右侧** > **开始性能分析**。您应该会看到一个类似于图 10.1 的窗口。

![](img/image062.jpg)

图 10.1:使用 Nsight 进行分析

选择**配置 CUDA 应用程序**，点击**启动**按钮，运行应用程序并收集指标，就像 NVVP 一样。一旦应用程序关闭，您将看到如图 10.2 所示的报告选项卡。 **CUDA 启动**选择将显示与 NVVP 报告相似的数据。

![](img/image063.jpg)

图 10.2:来自恩西特探查器的报告

选择 **CUDA 设备**或 **GPU 设备**报告显示应用中使用的设备的信息。这些信息类似于设备查询，但要详细得多。还有大量的其他报告可以生成，我鼓励大家去探索。

## 调试

使用 Nsight，我们可以像在常规应用程序代码中一样破解内核代码。为此，请通过单击 Visual Studio 代码窗口的左边距来设置断点，方式与设置宿主断点完全相同。要调试 CUDA 代码，Nsight 监视器必须正在运行。您必须从**菜单中选择**开始 CUDA 调试**，而不是使用菜单栏中的“开始调试”选项进行调试。**

应用程序将一直运行，直到遇到断点；然后，它将暂停并将控制传递回 Visual Studio。当程序在断点处暂停时，您可以打开两个非常有趣的窗口。在菜单栏的**菜单**项下，选择**窗口** > **CUDA Info** 。这将打开 CUDA 信息窗口。也可以选择**窗口** > **翘曲手表**打开翘曲手表窗口。CUDA 信息和 Warp Watch 窗口仅在应用程序遇到断点时从菜单栏中可用。

| ![](img/tip.png) | 提示:您可以冻结您不感兴趣调试的扭曲，方法是选择“扭曲”>“冻结”，然后冻结除当前块之外的所有扭曲或冻结除当前扭曲之外的所有扭曲。这将阻止其他扭曲或块继续进行。当您从断点恢复时，设备将在下一个扭曲或块处再次断开，具体取决于设置。通过这种方式，您可以依次检查每个扭曲或块。 |

### CUDA 信息窗口

![](img/image065.jpg)

图 10.3: CUDA 信息窗口

在 CUDA Info 窗口中，您可以通过单击左上角的下拉列表来查看应用程序的许多方面的信息，包括扭曲(默认)、纹理和内存分配。图 10.3 中的截图显示了扭曲信息。单击以蓝色突出显示的值会将您带到这些项目的信息页面。

CUDA 调试的时候，不出所料，可以按 **F11** 进入， **F10** 跳过代码。图 10.4 显示了扭曲信息窗口的更多细节。您可以看到扭曲在代码中的哪一行，以及扭曲在设备中是否处于活动状态。

![](img/image066.jpg)

图 10.4:通道、源线和状态

| ![](img/tip.png) | 提示:如果双击 CUDA Info 窗口中的一个扭曲，它将导致所有打开的 Warp Watch 窗口显示所选扭曲的已知信息。 |

通过检查 CUDA 信息窗口的车道视图，您可以很好地了解分支分割扭曲的方式。当一个扭曲被分成一个或多个组时，一些线程在执行单个分支时变得不活动。在执行每个分支的代码后，线程相互重新连接，并继续作为 32 个线程的集合。图 10.5 展示了一个被分成两部分的线程扭曲，给我们提供了偶数线程和奇数线程。

![](img/image067.jpg)

图 10.5:车道和分支

### 翘曲观察窗

我们可以在一个变量上设置一个观察，来跟踪它在扭曲执行时的变化。由于一个经线的 32 个线程都是同步执行的，所以观察同一个变量的 32 个副本会更有用，一个经线对应一个副本。您最多可以从**n light**>**Windows**>**CUDA Warp Watch**下的菜单栏打开四个 Warp Watch 窗口。在你的代码中设置一个断点，使用**开始 CUDA 调试**调试你的程序。图 10.6 显示了一个示例 Warp Watch 窗口。

![](img/image068.jpg)

图 10.6:翘曲手表

要将手表添加到 Warp Watch 窗口，在程序中断时，单击图 10.6 右上角显示的灰色 **<添加手表>** 单元格，并键入您想要观察的变量的名称。您可以使用 **F10** (移步)或 **F11** (移步)逐行遍历代码，查看 32 条经线的变量如何变化。如果你有一个 CUDA 信息窗口打开，你可以双击任何当前显示的扭曲(扭曲视图中的每一行代表一个不同的扭曲)。“扭曲观察”窗口将切换到选定扭曲的变量。要将块的第一个扭曲加载到打开的 CUDA 扭曲观察器中，请双击 CUDA 信息窗口的**块**视图中的块。

| ![](img/tip.png) | 提示:要对共享内存中的变量进行监视，您应该打开详细 PTAXS 输出。该选项可以在 CUDA C/C++ 部分的项目属性中找到。 |
| ![](img/image064.png) | 提示:您也可以使用 Visual Studio 的标准观察窗口来观察变量。当程序中断时，右键单击代码中的变量名称，并从上下文菜单中选择添加监视。请注意，使用此技术时，仅显示当前扭曲的第一个线程的值。因此，这对于观察常量和共享变量非常有用，因为它们是块范围的。 |

在启动调试程序之前，一定要重建应用程序。调试器可能不会在运行应用程序之前重新生成，因此如果您对代码进行了更改，则必须重新生成项目。

| ![](img/tip.png) | 提示:您可能会注意到扭曲窗口中的变量不会随着光标而改变。要更好地将变量的变化与光标匹配，请导航到“方向”>“选项”，并将“默认时间轴轴模式”的值设置为“相对于光标”。 |

当应用程序使用 Nsight 调试器时，它在主机上运行。可以使用`cout`快速写入控制台窗口。如果使用`printf`，Nsight 调试器将打印到屏幕上，您也可以使用标准的 Visual Studio 调试器进行调试。用 Visual Studio 调试时，所有对`printf`的调用都会被忽略，对内核中`cout`的调用会导致编译错误。删除生产代码中的所有`cout`和`printf`调用。