調試 cuda kernel

? ? ? ? 調試 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-gdb:?Nsight 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%的機器學習訓練…