著色器是在 GPU 上運行的專用程序,可處理光線、像素、頂點和紋理,以實現獨特的視覺效果。借助著色器,您可以為渲染的圖像添加創意表達和真實感。它們在光線追蹤中對于模擬逼真的光照、陰影和反射至關重要。
我們喜歡著色器,但它們可能很難調試。著色器計算非常復雜,并且跨多個線程運行,這可能會導致同步問題和難以重現的不一致錯誤。開發者通常必須手動追蹤著色器邏輯,確定正在訪問的資源,并推斷錯誤發生的位置。這一過程效率低下,通常需要逐步注釋著色器的某些部分,以測試和定位問題:一種容易出錯的策略。
由于渲染技術如降噪等使用了循環緩沖區,因此會帶來額外的挑戰。這些緩沖區中的錯誤會跨幀傳播,因此很難確定根本原因。同樣,傳統調試工具通常無法提供必要的見解,因此您不得不采用手動調試技術來追蹤多個通道并找到問題的根源。
NVIDIA Nsight Graphics 中的全新著色器調試器
NVIDIA 清楚地表明,圖形社區需要功能強大、直觀的著色器調試工具來滿足這些需求。今天,NVIDIA 發布了 NVIDIA Nsight Graphics 中的新著色器調試器。該工具為 Vulkan 應用程序提供測試版,使您能夠實時調試數百或數千行長的復雜著色器。
Shader Debugger 代表了 GPU 調試技術的重大飛躍,為診斷和解決著色器問題提供了硬件加速解決方案。該工具旨在支持光線追蹤、光柵和計算著色器(即將推出網格著色器支持),使您能夠快速調試原本需要更長時間才能解決的問題。借助 Shader Debugger,您可以快速確定并解決問題的根源,例如不正確的法線計算、環境光遮蔽錯誤和紋理映射問題。
圖 1 展示了在 NVIDIA Omniverse 示例中調試光線生成著色器的示例。正在檢查 Warp View。每一行都是 warp,綠色單元格表示 warp 中的線程,紅色單元格表示線程已停止在當前斷點。

使用 Nsight Graphics 調試著色器使用熟悉的調試工作流程。主要功能包括:
- 實時調試:您可以在應用程序運行時檢查和修改著色器代碼,從而更輕松地實時識別和解決問題。
- 設置斷點:暫停執行帶有源級斷點的著色器并檢查變量,這與傳統 CPU 調試類似。這允許逐步執行和分析著色器代碼。
- 條件斷點:為斷點添加條件以隔離特定場景或值,通過專注于工作負載的相關區域簡化調試過程。
- Locals 和 Watch 窗口:使用 Locals 或 Watch 窗口檢查斷點處的變量值,從而更輕松地識別差異以及值偏離預期的位置。
- Warp 信息和 Focus Picker:Warp View 概述了線程執行狀態,而 Focus Picker 則提供了著色器活動的圖形視角。這些工具使開發者能夠在上下文中可視化和理解 GPU 行為。
著色器調試器入門
當您將 Nsight Graphics 連接到目標應用時,您會發現 Shader Debugger 是一個新的可選擇活動。選擇要分析的應用可執行文件。如果您使用主機通過網絡調試目標,請確保您已連接到目標系統。圖形以全速運行,直到達到指定的斷點,因此在導航到感興趣的位置進行調試時不會影響性能,并在調試時盡可能減少開銷。
著色器調試器功能
啟動著色器調試器后,系統將首先顯示所有圖形管線及其包含的著色器。在圖 2 中,程序和著色器顯示在左側的列表中。單擊左鍵即可打開具有屏幕空間環境光遮蔽(Screen Space Ambient Occlusion,SSAO)的著色器,并在右側顯示相應的源代碼。

通過設置斷點,您可以在特定點暫停執行著色器代碼,這與傳統調試工具類似。當達到斷點時,應用程序會暫停,您可以檢查著色器的狀態,包括本地變量。通過檢查著色器執行中特定點的變量,您可以診斷問題。
您還可以逐行瀏覽著色器代碼,看著變量如何被填充以及著色器邏輯如何執行。這是一個用于了解著色器如何識別問題的強大工具。當前范圍內的變量顯示在 Locals 窗口中。
扭曲視圖
Warp View 概述了著色器單元級別的 GPU 駐留內容。它顯示了當前斷點處的線程束以及線程束中的哪些線程在該斷點處停止。這有助于您了解著色器是如何在 GPU 上執行的。
在圖 3 所示的表中,每一行都表示一個 warp,每個塊是該 warp 中的一個線程。紅色塊表示已在您設置的斷點處停止的線程,而綠色塊表示未在當前斷點處停止的線程。您可以選擇單個線程以檢查相應的局部變量。

焦點拾取器
Focus Picker 可幫助您可視化您正在調試的著色器代碼和低級 GPU 執行對渲染結果的影響。它提供了當前正在運行的片段的視覺顯示,允許您檢查這些片段疊加在當前渲染目標上。Focus Picker 顯示當前以淺藍色著陸的片段,以及正在運行的黃色片段。
在圖 4 中,Focus Picker (左) 顯示了每個單個像素構建時的渲染目標。您可以逐步瀏覽正在渲染的場景,并檢查相應的變量、線程束、線程和單個片段的源代碼。逐步瀏覽源代碼將顯示正在生成的片段的進度。單擊任意單個片段即可開始檢查和調試。

著色器調試器硬件要求
Shader Debugger 需要雙 GPU 本地系統或網絡設置,其中一個系統托管 NVIDIA Nsight Graphics,另一個系統運行目標應用程序。Shader Debugger 除了任何其他獨立或集成的 GPU 外,還可與 NVIDIA Ampere GPU 及更高版本的 GPU 配合使用。NVIDIA Nsight Graphics 還支持遠程調試。
計算工作負載支持指令級搶占以中斷代碼執行進行調試,因此您可以逐步執行指令來檢查程序的狀態。但圖形工作負載僅支持基元級搶占,這允許在三角形級別搶占 GPU,而不是按光線、頂點或片段搶占。調試任務需要指令級精度,因此 Nsight Graphics 使用雙 GPU 設置來進行精確的著色器調試。
詳細了解 Nsight Graphics 2024.2
Nsight Graphics 2024.2 中包含更多新功能,可加速圖形調試和分析工作流程。查看 SIGGRAPH 2024 大會上的開發者工具聚焦視頻,了解 Nsight Tools 的最新創新成果。
結束語
Nsight Graphics Shader Debugger 是圖形開發者旨在調試應用并實現高質量視覺結果的必備工具。其強大的功能集和硬件加速性能可確保調試復雜著色器的過程比以往更容易訪問和高效。
著色器調試器現已提供 Vulkan 應用的測試版。下載 Nsight Graphics 2024.2 開始使用。在 Nsight Graphics 窗口右上角的“Feedback”(反饋)按鈕下,分享您在測試版中的體驗。
瀏覽更多 Nsight 開發者工具和教程。在 Nsight Graphics 開發者論壇上提出問題、提供反饋并與圖形開發者社區互動。
?