调试 CUDA Kernel 并进入 __device__ 函数是 CUDA 开发中一项非常重要的技能。这主要依赖于 NVIDIA 的官方调试器 NVIDIA Nsight Systems (用于系统级分析) 和 NVIDIA Nsight Compute (用于内核级分析) 以及经典的 cuda-gdb (命令行调试器)。

这里将重点介绍两种最常用和强大的方法:使用 Nsight Visual Studio Code Edition (图形化界面,推荐) 和 cuda-gdb (命令行)。

 

方法一:使用 Nsight VSCode Edition (图形化界面,最推荐)

        Nsight for VSCode 提供了类似于调试 CPU 代码的直观体验,是当前调试 CUDA 的首选工具。

前提条件
  1. 安装 NVIDIA 驱动和 CUDA Toolkit: 确保你的系统安装了正确版本的驱动和 CUDA。

  2. 安装 VSCode: 从 VSCode 官网 下载并安装。

  3. 安装 Nsight VSCode 插件: 在 VSCode 的扩展市场中搜索 “NVIDIA Nsight” 并安装。

  4. 确保你的代码是可调试的: 在编译你的 CUDA 代码时,必须使用 -G 或 -lineinfo 标志来生成调试信息。

    • -G: 生成完整的调试信息,但会严重禁用所有编译器优化,极大影响性能,仅用于调试。

    • -lineinfo (--generate-line-info): 生成行号信息,允许调试和性能分析,但对性能影响较小,是 Nsight Compute 性能分析的首选。对于调试 __device__ 函数,-lineinfo 通常就足够了。

    示例编译命令:

    nvcc -g -G -o my_program my_program.cu # 使用 -g -G 进行完整调试
    # 或者
    nvcc --device-debug -o my_program my_program.cu # CUDA 11.2+ 推荐方式,等同于 -g -G
    # 或者 (如果主要为了分析,附带一些调试能力)
    nvcc -lineinfo -o my_program my_program.cu
调试步骤
  1. 打开项目: 在 VSCode 中打开你的 CUDA 项目文件夹。

  2. 创建调试配置文件:

    • 点击侧边栏的 “运行和调试” 图标 (或 Ctrl+Shift+D)。

    • 点击 “create a launch.json file”。

    • 在弹出的环境选择中,选择 CUDA C++

    • 这会在项目下生成一个 .vscode/launch.json 文件。

  3. 配置 launch.json:

    • 一个基本的配置如下。关键是指定正确的程序路径和 cuda-gdb 路径。

    {"version": "0.2.0","configurations": [{"name": "CUDA C++: Launch","type": "cuda-gdb","request": "launch","program": "${workspaceFolder}/my_program", // 你的可执行文件路径"stopAtEntry": false, // 设为 true 会在 main 函数入口处暂停"cwd": "${workspaceFolder}","args": [], // 传递给程序的命令行参数"environment": [], // 环境变量"externalConsole": false}]
    }
  4. 设置断点:

    • 在你的 CUDA 源码 (.cu 或 .cuh 文件) 中,在你想要中断的行的左侧空白处点击。

    • 你可以在 main 函数、<<<...>>> 调用的 kernel 函数、以及任何 __device__ 函数中设置断点。

  5. 开始调试:

    • 选择刚刚创建的 “CUDA C++: Launch” 配置。

    • 按 F5 或点击绿色的 “开始调试” 按钮。

    • 程序开始运行,并在遇到你设置的断点时暂停。

  6. 步入 __device__ 函数:

    • 当程序在 kernel 的某一行暂停时,你可以使用调试控制栏的按钮:

      • Step Into (F11): 如果当前行调用了某个 __device__ 函数,按 F11 会进入该 __device__ 函数的函数体

      • Step Over (F10): 执行当前行,但不进入函数内部。

      • Step Out (Shift+F11): 执行完当前函数,返回到调用它的地方。

  7. 查看变量和调用堆栈:

    • 在调试过程中,你可以在 VSCode 的左侧面板查看变量的当前值。

    • 调用堆栈 面板会显示你当前的执行位置,从 main 到 kernel 再到 __device__ 函数,清晰明了。

    • 你还可以将鼠标悬停在源码中的变量上来查看其值。

 

方法二:使用 cuda-gdb (命令行)

        但其实我们更习惯命令行操作,或者在没有图形界面的远程服务器上工作,cuda-gdb 是强大的选择。

前提条件

          同样,编译时必须使用 -G 或 -lineinfo 标志。

nvcc -g -G -o my_program my_program.cu

例如: nvcc -g -G --gpu-architecture=sm_120  sgemm_1.cu -o sgemm_1 -I ../cutlass/include/ -I ../cutlass/tools/util/include -I /usr/local/cuda/include

调试步骤
  1. 启动调试器:

    cuda-gdb ./my_program
  2. 设置断点:

    • 在 kernel 函数处设置断点:

      (cuda-gdb) break my_kernel_function
    • 在 __device__ 函数处设置断点:

      (cuda-gdb) break my_device_function
    • 在特定行设置断点:

      (cuda-gdb) break file.cu:123
  3. 运行程序:

    (cuda-gdb) run

    程序会开始执行,并在第一个断点处停止。

  4. 控制执行和步入 __device__ 函数:

    • next (n): Step Over,执行下一行。

    • step (s): Step Into,进入函数。如果下一行是 __device__ 函数调用,这会进入该 __device__ 函数体

    • continue (c): 继续运行直到下一个断点。

    • finish: Step Out,运行到当前函数返回。

  5. 检查线程和变量:

    • CUDA 调试的核心是理解线程。你可以切换当前关注的线程:

      (cuda-gdb) cuda thread 1  # 切换到 block 0, thread 0
      (cuda-gdb) cuda thread (1, 2, 3)  # 切换到 blockIdx(1,2), threadIdx(3)
    • 打印变量值:

      (cuda-gdb) print variable_name
  6. 退出:

    (cuda-gdb) quit
     

重要提示和常见问题

  1. 硬件兼容性: 并非所有 NVIDIA GPU 都支持调试功能。请查阅 NVIDIA 文档 确认你的 GPU 是否支持 “TCC 模式” 或 “Compute Preemption”,这对于调试至关重要。消费级显卡 (GeForce) 的调试支持可能不如专业卡 (Tesla, Quadro) 完善。

  2. 性能影响: 使用 -G 编译会极大降低 kernel 运行速度,并且调试本身也会引入开销。这是正常的,目的是为了获得精确的调试状态。

  3. 焦点线程: 在 CUDA 调试中,任何时候你都只在一个特定的 GPU 线程上下文中查看变量和执行代码。确保你正在检查你感兴趣的线程。

  4. Nsight vs cuda-gdbNsight VSCode 底层调用的也是 cuda-gdb,但它提供了无比友好的图形界面,极大地简化了操作,强烈推荐初学者和绝大多数开发者使用。

总结:要调试并进入 __device__ 函数,只需 1) 用 -G 编译2) 在 Nsight VSCode 或 cuda-gdb 中设置断点3) 使用 Step Into (F11 / step) 命令即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95964.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95964.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95964.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GD32自学笔记:4.ADC

while(1)里测试ADC是否正常首先&#xff0c;ADC引脚说明如下&#xff1a;ADC 通道引脚描述ADC_CHANNEL_0PA0端口 A 的引脚 0&#xff0c;可用于模拟信号输入&#xff0c;如传感器或外部电压。ADC_CHANNEL_1PA1端口 A 的引脚 1&#xff0c;常用于模拟输入&#xff0c;适用于一般…

渐变背景色和渐变字体颜色的实现方法

一、渐变背景色&#xff08;Gradient Background&#xff09;1. 线性渐变&#xff08;Linear Gradient&#xff09;通过 linear-gradient 创建从一种颜色到另一种颜色的线性渐变。代码示例<div class"linear-gradient"></div><style> .linear-grad…

Wi-Fi技术——传播与损耗

一、频段和信道 Wi-Fi通过发射无线电进行传输&#xff0c;而无线电的一个重要特性是频率。 频段&#xff1a;一个大的频率范围&#xff0c;如Wi-Fi工作在2.4GHz、5GHz、6GHz&#xff0c;其并不是一个值&#xff0c;而是一个范围信道&#xff1a;在每个频段中划分小的频率范围…

【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置

ℹ️大家好&#xff0c;我是练小杰&#xff0c;好久不见了&#xff0c;周末愉快&#xff0c;今天周六了&#xff01;&#xff01;做了CSDN博客才发现&#xff0c;坚持不断发文是那么的困难&#xff0c;大家都是好样的&#xff01;&#xff01;&#x1f606; 本文是针对 Mysql 的…

【RabbitMQ】----初识 RabbitMQ

1. MQ 是什么&#xff1f; 在互联网中&#xff0c;会经常使用 MQ 来作为消息通信服务&#xff0c;我们一起来看一下什么是 MQ 吧&#xff01; 1.1 MQ 本质 【MQ】&#xff08;Message queue&#xff09;&#xff0c;消息队列&#xff0c;字面意思来看&#xff0c;本质是一个…

深度学习:归一化技术

在深度学习中&#xff0c;归一化技术是提高模型训练效率和性能的重要手段。归一化通过调整输入数据的分布&#xff0c;使得模型在训练过程中更易于收敛&#xff0c;减少过拟合的风险。本文将介绍几种常见的归一化技术&#xff0c;包括特征归一化、批归一化、层归一化和实例归一…

【Javaweb学习|实训总结|Week1】html基础,CSS(选择器、常用样式、盒子模型、弹性盒布局、CSS定位、动画),js(基本类型、运算符典例)

开学前三周先进行企业实训&#xff0c;主要学习Javaweb并实现一些小的项目&#xff0c;本篇笔记主要记录第一周实训的知识总结以及个人遇到的问题及解答&#xff0c;用于日后复习回顾和知识巩固&#xff0c;希望可以帮到同样在学Javaweb的大家 文章目录D1html基础D2块元素与行…

SQL 拓展指南:不同数据库差异对比(MySQL/Oracle/SQL Server 基础区别)

在学习 SQL 的过程中&#xff0c;你可能会发现&#xff1a;同样的 “建表语句” 在 MySQL 能运行&#xff0c;在 Oracle 却报错&#xff1b;“分页查询” 的写法在 SQL Server 和 MySQL 完全不同。这是因为 MySQL、Oracle、SQL Server 是三大主流关系型数据库&#xff0c;虽都支…

论文阅读:DMD | Improved Distribution Matching Distillation for Fast Image Synthesis

论文地址&#xff1a;https://arxiv.org/abs/2405.14867 项目官网&#xff1a;https://tianweiy.github.io/dmd2/ 代码地址&#xff1a;https://github.com/tianweiy/DMD2 发表时间&#xff1a;2024年5月24日 分布匹配蒸馏&#xff08;DMD&#xff09;生成的一步生成器能够与教…

嵌入式 Linux 启动流程详解 (以 ARM + U-Boot 为例)

嵌入式 Linux 启动流程详解 (以 ARM U-Boot 为例) 对于嵌入式开发者而言&#xff0c;深入理解系统的启动流程至关重要。这不仅有助于进行底层驱动开发和系统移植&#xff0c;还能在遇到启动失败等问题时&#xff0c;快速定位和解决。本文将详细分解基于 ARM 架构的嵌入式 Linu…

在前端开发中,html中script 的type分别有哪几种?分别什么情况用到?

以下是 HTML 中<script>标签type属性的常见取值、说明及使用场景&#xff1a;type 值说明使用场景不写&#xff08;空值&#xff09;HTML5 中默认等同于text/javascript&#xff0c;表示普通 JavaScript 脚本绝大多数传统 JavaScript 代码&#xff0c;包括内联脚本和外部…

2025职教技能大赛汽车制造与维修赛道速递-产教融合实战亮剑​

各位职教同仁&#xff0c;2025年世界职业院校技能大赛总决赛争夺赛&#xff08;汽车制造与维修赛道&#xff09;国内赛区的战报新鲜出炉&#xff01;本次大赛以“技炫青春 能创未来”为主题&#xff0c;聚焦汽车产业链高质量发展需求&#xff0c;在真实场景中比拼技能&#xff…

日志 | Spring Boot 日志配置通用规律(AI问答)

Spring Boot 日志配置通用规律。想看特定日志&#xff0c;怎么打开日志开关 文章目录一、一句话总结二、AI问答版提问词AI的响应&#x1f4ca; Spring Boot 日志配置通用规律1. 基本语法结构2. 日志级别&#xff08;从详细到简洁&#xff09;&#x1f3af; 常用日志配置分类1. …

DJANGO后端服务启动报错及解决

1.报错信息[2025-09-05 17:08:54 0800] [23438] [INFO] Worker exiting (pid: 23438) [2025-09-05 17:08:54 0800] [23440] [ERROR] Exception in worker process Traceback (most recent call last):File "/www/SOP/lib64/python3.11/site-packages/gunicorn/arbiter.py&…

Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析

Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析 文章目录Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析摘要一、Q_OBJECT 宏是什么&#xff1f;二、Q_OBJECT 宏背后的源码三、moc 工具的作用四、信号与槽调用流程五、没有 Q_OBJECT 会怎样&#xff1f;六…

GD32自学笔记:5.定时器中断

定时器中断功能主要是两点&#xff1a;1.怎么配置的定时器中断时间间隔&#xff1b;2.中断里长什么样一、定时器中断配置函数直接在bsp_basic_timer.c里找到下面函数&#xff1a;void basic_timer_config(uint16_t pre,uint16_t per) {/* T 1/f, time T * pre,pertime (pre …

[Godot入门大全]目录

1 免责声明 资源分享免责声明&#xff1a; 本平台/本人所分享的各类资源&#xff08;包括但不限于文字、图片、音频、视频、文档等&#xff09;&#xff0c;均来源于公开网络环境中的可分享内容或已获授权的传播素材。 本平台/本人仅出于信息交流、资源共享之目的进行传播&…

使用 StringRedisTemplate 实现 ZSet 滚动查询(处理相同分数场景)

1. 为什么需要改进当 ZSet 中存在相同分数 (score) 的元素时&#xff0c;单纯使用分数作为偏移会导致数据漏查或重复。例如&#xff1a;多条记录具有相同时间戳&#xff08;作为分数&#xff09;分页查询时可能跳过相同分数的元素或重复查询相同分数的元素改进方案&#xff1a;…

【Android】安装2025版AndroidStudio开发工具开发老安卓旧版App

为了开发老旧的安卓App&#xff0c;这里记录一下2025版AndroidStudio的安装过程&#xff0c;如果卸载以后&#xff0c;可以按照此文章的步骤顺利重新安装继续使用。 文章目录安装包Android SDK新建项目新建页面构建项目Gradle下载失败构建失败构建完成编译失败安装失败关于APP在…

Python跳过可迭代对象前部元素完全指南:从基础到高并发系统实战

引言&#xff1a;跳过前部元素的核心价值在数据处理和系统开发中&#xff0c;跳过可迭代对象的前部元素是常见且关键的操作。根据2024年数据处理报告&#xff1a;92%的数据清洗需要跳过文件头部85%的日志分析需要忽略初始记录78%的网络协议处理需跳过头部信息65%的机器学习训练…