NVIDIA 已經提供了 Windows 系統的 GPU 驅動程序二進制符號服務器。現在,NVIDIA 也開始提供 Linux 系統的 CUDA Toolkit 符號。
我們提供什么?
NVIDIA 正在為 Linux 引入 CUDA Toolkit 符號,以增強應用程序開發功能。在應用程序開發過程中,您現在可以下載正在應用程序中調試或分析的 NVIDIA 庫的模糊符號。這是 CUDA 驅動程序的初始裝運(lib CUDA .so)和 CUDA 運行時(libcudart.so),將添加更多庫。
例如,當問題似乎與 CUDA neneneba API 有關時,可能并不總是能夠向 NVIDIA 提供具有所有庫加載信息的再現示例、核心轉儲或未同步堆棧跟蹤。提供符號化的調用堆棧可以幫助加快調試過程。
我們只是托管符號文件,所以調試數據不會被分發。符號文件包含模糊的符號名稱。
快速啟動指南
對于每個庫,有兩種推薦的使用模糊符號的方法:
- 通過解開庫
- 通過將.sym 文件部署為庫的符號文件
# Determine the symbol file to fetch and obtain it $ readelf -n /usr/local/cuda/lib64/libcudart.so # ... Build ID: 70f26eb93e24216ffc0e93ccd8da31612d277030 # Browse to https://cudatoolkit-symbols.nvidia.com/libcudart.so/70f26eb93e24216ffc0e93ccd8da31612d277030/index.html to determine filename to download $ wget https: //cudatoolkit-symbols.nvidia.com/libcudart.so/70f26eb93e24216ffc0e93ccd8da31612d277030/libcudart.so.12.2.128.sym # Then with appropriate permissions, either unstrip, $ eu-unstrip /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudart.so.12.2.128 libcudart.so.12.2.128.sym –o /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudart.so.12.2.128 # Or, with appropriate permissions, deploy as symbol file # By splitting the Build ID into first two characters as directory, then remaining with ".debug" extension $ cp libcudart.so.12.2.128.sym /usr/lib/debug/.build-id/70/f26eb93e24216ffc0e93ccd8da31612d277030.debug |
示例:符號化
這里有一個簡化的例子來展示象征的用途。示例應用程序 test_shared 的數據損壞導致將無效句柄傳遞給 CUDA Runtime API cudaStreamDestroy。默認安裝 CUDA Toolkit,并且沒有混淆符號,gdb 中的輸出可能如下所示:
Thread 1 "test_shared" received signal SIGSEGV, Segmentation fault. 0x00007ffff65f9468 in ?? () from /lib/x86_64-linux-gnu/libcuda.so.1 (gdb) bt #0 0x00007ffff65f9468 in ?? () from /lib/x86_64-linux-gnu/libcuda.so.1 #1 0x00007ffff6657e1f in ?? () from /lib/x86_64-linux-gnu/libcuda.so.1 #2 0x00007ffff6013845 in ?? () from /usr/local/cuda/lib64/libcudart.so.12 #3 0x00007ffff604e698 in cudaStreamDestroy () from /usr/local/cuda/lib64/libcudart.so.12 #4 0x00005555555554e3 in main () |
在以前面描述的方式之一應用模糊符號后,它將提供堆棧跟蹤,如以下示例所示:
Thread 1 "test_shared" received signal SIGSEGV, Segmentation fault. 0x00007ffff65f9468 in libcuda_8e2eae48ba8eb68460582f76460557784d48a71a () from /lib/x86_64-linux-gnu/libcuda.so.1 (gdb) bt #0 0x00007ffff65f9468 in libcuda_8e2eae48ba8eb68460582f76460557784d48a71a () from /lib/x86_64-linux-gnu/libcuda.so.1 #1 0x00007ffff6657e1f in libcuda_10c0735c5053f532d0a8bdb0959e754c2e7a4e3d () from /lib/x86_64-linux-gnu/libcuda.so.1 #2 0x00007ffff6013845 in libcudart_43d9a0d553511aed66b6c644856e24b360d81d0c () from /usr/local/cuda/lib64/libcudart.so.12 #3 0x00007ffff604e698 in cudaStreamDestroy () from /usr/local/cuda/lib64/libcudart.so.12 #4 0x00005555555554e3 in main () |
符號化的調用堆棧可以作為提供給 NVIDIA 進行分析的錯誤描述的一部分進行記錄。
結論
當您必須使用 CUDA 來評測和調試應用程序,并且希望與 NVIDIA 共享一個調用堆棧進行分析時,請使用 CUDA 符號服務器。分析和調試將更快更容易。
如果您有任何疑問,請訪問 開發者工具論壇。
?