构建和运行

在 NVIDIA Nsight VSE 中使用 CUDA 调试器构建和运行项目。

构建和运行

在本节中,了解有关如何配置 CUDA 项目的属性、启动 CUDA 调试器以及如何将调试附加到正在运行的 CUDA 进程的更多信息。

CUDA 项目属性

借助 NVIDIA Nsight™ VSE,您可以设置 CUDA 项目的参数,以便自定义您的调试体验。

要配置项目的 CUDA 属性页

  1. 在解决方案资源管理器中,单击项目名称,使其突出显示。

  2. 从“项目”菜单中,选择“属性”。将打开“属性页”窗口。

  3. 在左侧窗格中选择 CUDA C/C++

通用

通用 页面上,您可以配置以下选项

../_images/cuda_properties_common.001.png
  1. CUDA 工具包自定义目录 — 此选项设置 CUDA 工具包的自定义路径。您可以编辑路径,选择“浏览”以选择路径,或选择“从父项或项目默认值继承”。

  2. 源依赖项 — 此选项允许您添加其他源文件依赖项。如果您有已使用 #include 语句设置的依赖项,则无需在此处显式指定。

  3. 编译器输出 (obj/cubin) — 这将输出设置为 .obj.cubin 文件。默认设置为 $(IntDir)%(Filename)%(Extension).obj

  4. 附加包含目录 — 此选项允许您列出至少一个要添加到包含路径的附加目录。如果您有多个目录,请使用分号分隔它们。

  5. 使用主机包含目录 — 此选项指定是否对设备代码使用主机编译器使用的附加包含目录。

  6. 保留预处理文件 — 此选项允许您选择是否删除 CUDA 编译器生成的预处理器文件(例如,.ptx.cubin.cudafe1.c 等)。

  7. 保留目录 — 此选项设置将保留 CUDA 编译器生成的预处理器文件的目录路径。

  8. 生成可重定位的设备代码 — 此设置选择是否将输入文件编译为包含可重定位设备代码的目标文件。

  9. NVCC 编译类型 — 此选项设置您期望的 NVCC 编译输出。此处的选项包括以下内容

    • 生成混合对象文件 (--compile)

    • 生成混合 .c 文件 (-cuda)

    • 生成 .gpu 文件 (-gpu)

    • 生成 .cubin 文件 (-cubin)

    • 生成 .ptx 文件 (-ptx)

  10. CUDA 运行时 — 此选项允许您指定要使用的 CUDA 运行时库的类型。此处的选项包括以下内容

    • 无 CUDA 运行时库 (-cudart none)

    • 共享/动态 CUDA 运行时库 (-cudart shared)

    • 静态 CUDA 运行时库 (-cudart static)

设备

设备 页面上,您可以配置以下选项

../_images/cuda-project-properties-device.01.png
  1. PTXAS 输出中交错的 C 代码 — 此设置选择是否将源代码插入到生成的 PTX 中。

  2. 代码生成 — 此选项指定要为其生成代码的 NVIDIA GPU 架构的名称。如果您从下拉菜单中单击 编辑,则会出现以下弹出窗口

    ../_images/cuda-project-properties-code-gen-edit.01.png

    如果您编辑此字段,则要使用的正确语法是 [arch],[code](例如,compute_80,sm_80)。如果选择的NVCC 编译类型compile,则可以列出多个 arch/code 对,并用分号分隔(例如,compute_70,sm_70;compute_75,sm_75)。

  3. 生成 GPU 调试信息 — 此设置选择是否由 CUDA 编译器生成 GPU 调试信息。

  4. 生成行号信息 — 此选项选择是否为设备代码生成行号信息。如果 生成 GPU 调试信息 处于启用状态 (-G),则也会自动生成行信息 (-lineinfo)。

  5. 最大使用寄存器 — 此选项指定 GPU 函数可以使用的最大寄存器数量。

  6. 详细 PTXAS 输出 — 此选项选择是否使用详细 PTXAS 输出。

  7. 拆分编译拆分编译 NVCC 选项 指定编译器允许用于并行编译的线程数的上限。通过拆分编译,编译器将您的代码分解为内核组,对其进行并行编译和优化,以加快编译时间。

    拆分编译可以设置为

    • 默认--split-compile 参数未传递给编译器,并且禁用拆分编译(等效于 --split-compile=1)。

    • 最大线程数 (–split-compile=0):编译器根据您的软件/硬件配置自动管理要使用的最大线程数。

    • 最大线程数(扩展)(–split-compile-extended=0):编译器根据您的软件/硬件配置自动管理要使用的最大线程数。

    • 自定义 (–split-compile=):使用“拆分编译线程数”属性字段来指定编译器线程数的自定义上限值。

    • 自定义(扩展)(–split-compile-extended=):使用“拆分编译线程数”属性字段来指定编译器线程数的自定义上限值。

注意

  • 除非将拆分编译设置为“自定义”或“自定义(扩展)”,否则将忽略“拆分编译线程数”中指定的值。

  • 将拆分编译设置为“自定义”或“自定义(扩展)”且未提供“拆分编译线程数”的值将导致构建错误,并显示以下文本:Invalid command line switch for "". The parameter "SplitCompile" requires missing parameter "SplitCompileCustomThreads" to be set.

主机

主机 页面上,您可以配置以下选项

../_images/cuda_properties_host.001.png
  1. 附加编译器选项 — 此设置列出了主机项目属性不支持的其他主机编译器选项。

  2. 预处理器定义 — 此选项允许您列出预处理器定义。

  3. 使用主机预处理器定义 — 此选项选择是否使用主机编译器用于设备代码的定义。

  4. 仿真 — 此选项指定是否生成模拟代码。

  5. 生成主机调试信息 — 此选项指定 CUDA 编译器是否将生成主机调试信息。

  6. 使用快速数学库 — 此选项选择是否使用快速数学库。

  7. 优化 — 此字段选择代码优化的选项。可用选项包括以下内容

    • <从主机继承>

    • 已禁用 (/Od)

    • 最小化大小 (/O1)

    • 最大化速度 (/O2)

    • 完全优化 (/Ox)

  8. 运行时库 — 此字段选择要用于链接的运行时库。可用选项包括以下内容

    • <从主机继承>

    • 多线程 (/Mt)

    • 多线程调试 (/Mtd)

    • 多线程 DLL (/MD)

    • 多线程调试 DLL (/MDd)

    • 单线程 (/ML)

    • 单线程调试 (/MLd)

  9. 基本运行时检查 — 此字段执行基本运行时错误检查,与除调试之外的任何优化类型不兼容。可用选项包括以下内容

    • <从主机继承>

    • 默认

    • 堆栈帧 (/RTCs)

    • 未初始化的变量 (/RTCu)

    • 两者 (/RTC1)

  10. 启用运行时类型信息 — 此选项选择是否添加用于在运行时检查 C++ 对象类型的代码。

  11. 警告级别 — 此选项选择您希望编译器在检查潜在的可疑结构时有多严格。此处的可用选项包括

    • <从主机继承>

    • 关闭:关闭所有警告 (/W0)

    • 级别 1 (/W1)

    • 级别 2 (/W2)

    • 级别 3 (/W3)

    • 级别 4 (/W4)

    • 启用所有警告 (/Wall)

命令行

命令行 页面显示了根据您选择的设置的大致命令行参数。

../_images/cuda_properties_cmd_line.001.png

启动 CUDA 调试器

确保您要调试的模块是使用生成调试符号的编译器构建的。如果模块没有符号,则该模块中的所有函数都将禁用调试。

注意

CPU/GPU 调试支持

旧版 CUDA 调试器 仅支持调试 GPU CUDA 内核。

您无法在调试目标进程中的 CUDA 代码的同时调试同一进程的 x86 代码。使用单独的 Visual Studio 实例来调试目标应用程序的主机部分。如果您希望在附加 CUDA 调试器时调试 CUDA 应用程序的主机部分,则必须使用不同的 Visual Studio 实例进行附加。

将同一 Visual Studio 实例附加到目标应用程序的主机部分和设备部分进行调试将导致调试器冲突。结果是目标应用程序和 CUDA 调试器在被本机调试器的操作阻止时挂起。

下一代 CUDA 调试器 允许您同时调试 CPU 和 GPU 代码。

注意

远程调试支持

旧版 CUDA 调试器 支持本地和远程调试。

下一代 CUDA 调试器 仅支持本地调试。当前不支持远程调试。

本地调试

NVIDIA Nsight™ VSE 工具支持在单个系统上启动和调试程序。有关更多信息,请参阅 Nsight 软件的系统要求。另请参阅 设置本地调试 主题,了解如何配置具有多个 GPU 的调试设置。

要配置项目以进行本地调试

注意

请注意,此配置仅适用于 旧版 CUDA 调试器

下一代 CUDA 调试器 当前不支持远程调试,并且将始终作为本地调试器运行。

  1. 启动 Visual Studio。

  2. 打开一个基于 CUDA 的项目。

  3. 在解决方案资源管理器中,右键单击项目名称,然后选择 Nsight 用户属性。(或者,您也可以转到 项目 菜单 > Nsight 用户属性。)

    ../_images/cuda-debugger-local-launch.01.png
  4. 在“连接名称”文本字段中,键入:localhost

  5. 单击“确定”。

要在本地启动 CUDA 调试器

  1. 在主机上,转到 Visual Studio 中的“Nsight”菜单。

  2. Nsight 菜单 中,选择以下选项之一

    1. 启动 CUDA 调试 (下一代)

    2. 启动 CUDA 调试 (旧版)

      有关为您的系统配置选择正确调试器的信息,请参阅 系统要求 页面。

      或者,您也可以选择

      • 右键单击项目,然后选择 调试 > 启动 CUDA 调试 (旧版)/(下一代)

      • 单击 启动 CUDA 调试 (旧版)/(下一代) 工具栏图标。

        通过右键单击 Visual Studio 工具栏并切换 Nsight CUDA 调试 来显示/隐藏此图标组。

      • 单击 启动 CUDA 调试 (旧版)/(下一代) 工具栏菜单项。

        通过右键单击 Visual Studio 工具栏并切换 Nsight 连接 来显示/隐藏此图标组。

  3. 如果您启动了旧版 CUDA 调试

    • 您会注意到,在主机上,弹出消息指示已建立连接。

    • 请注意,在远程调试配置中,必须在调试之前启动 Nsight Monitor。但是,在本地调试设置中,启动 CUDA 调试器时,Nsight Monitor 将自动启动。

    • CUDA 调试器在本地计算机上启动目标应用程序。CUDA 调试器通过端口 8000 进行通信(默认情况下),但可以在 Nsight Monitor 选项中更改此设置。(有关如何配置默认端口设置的更多详细信息,请参阅 主机基础知识目标基础知识。)您可以使用 CUDA 调试器暂停执行、单步执行和执行其他调试器功能。

远程调试

注意

如果您使用的是 下一代 CUDA 调试器

当前不支持远程调试。目标计算机假定为 localhost。请参阅 本地调试

您可以在任何正确配置的远程主机上启动和调试程序。有关如何在远程计算机上安装和配置 NVIDIA Nsight™ VSE 工具的更多信息,请参阅 操作指南:安装 Nsight Monitor设置远程调试

要配置项目以进行远程调试

  1. 启动 Visual Studio。

  2. 打开一个基于 CUDA 的项目。

  3. 在解决方案资源管理器中,右键单击项目名称,然后选择 Nsight 用户属性。(或者,您也可以转到 项目 菜单 > Nsight 用户属性。)

  4. 在“连接名称”字段中,将 localhost 替换为目标计算机的名称(将在其上运行要调试的应用程序的远程计算机)。

    这可以是本地网络中计算机的 IP 地址,也可以是网络上识别的计算机名称。

    ../_images/cuda-debugger-remote-launch.01.png

    重要提示:请勿使用映射驱动器来指定主机名。例如

    错误:M:\

    正确:jsmith.mydomain.com

  5. 在“工作目录”字段中,您可以指定要应用程序使用的目录。默认工作目录是项目目录。

  6. 设置任何需要的环境变量。

  7. 单击“确定”按钮。

要远程启动 CUDA 调试器

  1. 在目标计算机(远程计算机)上启动 Nsight Monitor。

    1. 从 Windows “开始”菜单中,选择 所有程序

    2. 向下滚动已安装的程序并选择:NVIDIA Corporation > Nsight Monitor。

  2. 可选:要在文件无法复制到远程系统时中止启动,请将“同步失败时中止”选项设置为“True”。

    1. 从“Nsight”菜单中,选择“Nsight 选项”。将打开“Nsight 选项”窗口。

    2. 在左侧窗格中,选择“调试器”。

    3. 在“启动”部分下,将“同步失败时中止”设置为“True”。

    4. 单击“确定”按钮。

  3. 从 Visual Studio 中的 Nsight 菜单

    1. 启动 CUDA 调试 (旧版)

    2. 请注意,启动 CUDA 调试 (下一代) 当前不支持远程调试。如果启动,它将尝试在本地进行调试。

      或者,您也可以选择

      • 右键单击项目,然后选择 调试 > 启动 CUDA 调试 (旧版)/(下一代)

      • 单击 启动 CUDA 调试 (旧版)/(下一代) 工具栏图标。

        通过右键单击 Visual Studio 工具栏并切换 Nsight CUDA 调试 来显示/隐藏此图标组。

      • 单击 启动 CUDA 调试 (旧版)/(下一代) 工具栏菜单项。

        通过右键单击 Visual Studio 工具栏并切换 Nsight 连接 来显示/隐藏此图标组。

  4. 旧版 CUDA 调试启动

    • 主机与远程计算机上的 Nsight Monitor 通信,同步应用程序文件,并在远程计算机上启动应用程序。CUDA 调试器通过端口 8000 进行通信(默认情况下),但可以在 Nsight Monitor 选项中更改此设置。(有关如何配置默认端口设置的更多详细信息,请参阅 主机基础知识目标基础知识。)您可以使用 CUDA 调试器暂停执行、单步执行和执行其他调试器功能。

    • 要在文件同步时取消调试会话,请选择“Nsight” > “取消调试启动”。

注意:使用旧版 CUDA 调试器时,您无法同时对同一进程执行 CUDA 调试和 x86 调试。

附加到正在运行的 CUDA 进程

注意

此功能仅受旧版 CUDA 调试器支持。下一代 CUDA 调试器将在未来的版本中支持此功能。

借助 NVIDIA Nsight™ VSE,可以将 Visual Studio 调试器附加到自由运行的 CUDA 应用程序。此功能需要一些一次性设置,并在启动要调试的程序时设置其他环境变量。下面概述了所需的步骤。

注意

请注意,如果您在 Windows 10 x64 计算机上使用 NVIDIA Nsight™ VSE,则将无法附加到 win32/x86 CUDA 应用程序。仅支持 64 位 CUDA 应用程序。

一次性设置

  1. 在目标计算机(本地或远程,取决于您的配置)上,右键单击任务栏上的 Nsight Monitor 图标,然后选择 选项

    ../_images/nsight_monitor_taskbar_options.001.png
  2. 选择 CUDA (旧版) 选项卡。请注意,附加不适用于下一代调试器。

  3. 对于 将此监视器用于 CUDA 附加 选项,单击下拉菜单并选择 True。如果未启用此设置,您将在主机上的“附加”对话框中收到警告消息。

    ../_images/nsight_monitor_cuda_legacy_attach_true.001.png

    需要此设置才能允许 Nsight Monitor 附加到自由运行的 CUDA 应用程序。在安装 NVIDIA Nsight™ VSE 后,只需配置一次即可。

启动应用程序时

要使进程可 CUDA 附加,您必须设置环境变量 NSIGHT_CUDA_DEBUGGER=1。严格要求是必须在应用程序调用 cuInit() 之前设置环境变量。如果应用程序使用 CUDA 运行时 API,则必须在进行第一个 CUDA 运行时 API 调用之前设置环境变量。

由于环境变量通常由子进程继承,因此在启动子进程的父进程中设置 NSIGHT_CUDA_DEBUGGER=1 通常也会使子进程可 CUDA 调试。启动器进程和群集节点可以从中受益。

注意

设置 NSIGHT_CUDA_DEBUGGER=1 可能会降低应用程序的性能,因为调试器是常驻的。在 Tesla™ 设备和无头设备上,影响最小;在具有桌面的显示设备上,影响最为严重,在这种情况下,调试器可能需要序列化原本应该是异步的启动。因此,并不总是希望在系统范围或用户范围内设置 NSIGHT_CUDA_DEBUGGER=1

不建议将 NSIGHT_CUDA_DEBUGGER 设置为系统环境变量,因为它可能会对使用 CUDA 调试器的其他应用程序的性能产生不利影响。

在 Visual Studio 中附加到 CUDA 应用程序

  1. 在主机上,在 Visual Studio 中打开您的项目。

    1. 此过程也适用于没有项目的情况。但是,在这种情况下,Visual Studio 将不记住任何设置的断点。

    2. 要解析和命中源断点,调试器需要源文件的绝对路径与构建到应用程序中的调试符号中的路径匹配。

      请注意,如果项目通过 Nsight > 启动 CUDA 调试 (旧版) 命令启动时命中断点,则它也适用于附加。

      请注意,附加不适用于 CUDA 下一代调试器。

  2. 转到 调试 > 附加到进程。(或者,转到“工具”菜单,然后选择“附加到进程”。)

    这将打开“附加到进程”对话框。

  3. 单击 传输 字段旁边的下拉菜单,然后选择 Nsight GPU 调试器

    ../_images/cuda_attach_process_dropdown.02.png
  4. 确保您的主机名列在 连接目标 字段中。

    请注意,此字段默认情况下为空白;您需要在第一次打开此对话框时手动选择您的计算机名称。

  5. 当您在“连接目标”字段中输入计算机的主机名时,可用进程列表将显示在对话框中。

    1. 如果进程灰显且“类型”列中 列出 CUDA,则无法使用 CUDA 调试器对其进行调试。通常,发生这种情况是因为在该进程中未设置 NSIGHT_CUDA_DEBUGGER 环境变量。

    2. 如果进程灰显且“类型”列中 列出 CUDA,则 CUDA 调试器已附加。在这种情况下,无法再次附加。

    3. 可以附加的进程将正常显示,并且 附加 按钮将启用。

    ../_images/cuda_attach_dialog.01.png
  6. 当您选择所需的进程并单击 附加 时,调试会话将开始,就像您使用了 Visual Studio 中的 NVIDIA Nsight™ VSE 菜单(Nsight > 启动 CUDA 调试 (旧版))一样。

要结束,请选择 调试 > 停止调试。请注意,这将终止应用程序。

在内核启动期间附加到 CUDA

当可附加进程遇到 GPU 异常时,将显示以下对话框。GPU 异常可以是 MMU 故障、内联断点(CUDA C 中的 asm("brkpt;");)或其他异常情况。

../_images/cuda_attach_gpuexception.001.png

出于安全原因,如果任何桌面 GPU 当前处于硬件模式调试状态,则不会显示该对话框,并且 GPU 将自动恢复。虽然详细的 GPU 检查需要附加 Visual Studio 实例,但该对话框会显示故障设备名称、CUcontext、内核(乱码名称)以及异常原因

../_images/cuda_attach_gpuexception.002.png

以下选项可用

  • 继续执行 — 这将关闭对话框并恢复 GPU 和应用程序执行。此操作等效于 Visual Studio 中的 调试 > 继续 命令。对话框将在下一个 GPU 异常时重新出现。如果选中“不再询问我”框,则程序将改为自动继续,而不会再次显示此对话框。此设置不会跨程序运行保存。

  • 调试应用程序 — 这将暂停程序,同时用户附加 CUDA 调试器

    ../_images/cuda_attach_waiting_dialog.001.png

    取消或关闭此新对话框将返回到原始对话框。当 CUDA 调试器附加时,对话框会自动关闭并报告异常。

  • 退出应用程序 — 终止程序。关闭对话框等效于选择“退出应用程序”。

声明

声明

所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称和单独称为“材料”)均按“原样”提供。NVIDIA 不对材料做出任何明示、暗示、法定或其他方面的保证,并且明确声明不承担所有关于不侵权、适销性和针对特定用途适用性的暗示保证。

所提供的信息据信是准确可靠的。但是,NVIDIA Corporation 对使用此类信息或因使用此类信息而可能导致的侵犯第三方专利或其他权利的后果不承担任何责任。未以暗示或其他方式授予 NVIDIA Corporation 任何专利权下的许可。本出版物中提及的规格如有更改,恕不另行通知。本出版物取代并替换以前提供的所有其他信息。未经 NVIDIA Corporation 明确书面批准,NVIDIA Corporation 产品不得用作生命维持设备或系统中的关键组件。

商标

NVIDIA 和 NVIDIA 徽标是 NVIDIA Corporation 在美国和其他国家/地区的商标或注册商标。其他公司和产品名称可能是与其关联的各自公司的商标。