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 符号服务器。分析和调试将更快更容易。
如果您有任何疑问,请访问 开发者工具论坛。