NVIDIA CUDA 工具包符号服务器

这篇文章最初发表在 NVIDIA 技术博客上。

NVIDIA 已经提供了 Windows 系统的 GPU 驱动程序二进制符号服务器。现在,NVIDIA 也开始提供 Linux 系统的 CUDA Toolkit 符号

我们提供什么?

NVIDIA 正在为 Linux 引入 CUDA Toolkit 符号,以增强应用程序开发功能。在应用程序开发过程中,您现在可以下载正在应用程序中调试或分析的 NVIDIA 库的模糊符号。这是 CUDA 驱动程序的初始装运(lib CUDA .so)和 CUDA 运行时(libcudart.so),将添加更多库。

例如,当问题似乎与 CUDA neneneba API 有关时,可能并不总是能够向 NVIDIA 提供具有所有库加载信息的再现示例、核心转储或未同步堆栈跟踪。提供符号化的调用堆栈可以帮助加快调试过程。

我们只是托管符号文件,所以调试数据不会被分发。符号文件包含模糊的符号名称。

快速启动指南

对于每个库,有两种推荐的使用模糊符号的方法:

  • 通过解开库
  • 通过将.sym 文件部署为库的符号文件
bash 复制代码
# 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 中的输出可能如下所示:

shell 复制代码
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 ()

在以前面描述的方式之一应用模糊符号后,它将提供堆栈跟踪,如以下示例所示:

shell 复制代码
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 符号服务器。分析和调试将更快更容易。

如果您有任何疑问,请访问 开发者工具论坛

阅读原文

相关推荐
basketball6166 天前
AI Infra 硬件体系与编程模型:17. CUDA编程基础:底层驱动 API 调用
人工智能·microsoft·nvidia·cuda
basketball6169 天前
AI Infra 硬件体系与编程模型:14. CUDA编程基础:事件与精确性能测量
人工智能·nvidia·cuda
kyle~9 天前
推理部署---CUDA 执行模型(SM、Block、Warp 与 SIMT)
人工智能·nvidia·cuda
basketball6169 天前
AI Infra 硬件体系与编程模型:15. CUDA编程基础:混合精度计算
人工智能·nvidia·cuda
小白狮ww10 天前
3B 参数,毫秒级响应:LocateAnything 如何重新定义开放世界目标检测
人工智能·目标检测·计算机视觉·视觉检测·大语言模型·nvidia·locateanything
kyle~11 天前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
kyle~11 天前
ROS 2 与 Isaac Sim 联合仿真(三):工程化部署、性能优化、多机器人与 Sim-to-Real
机器人·nvidia·仿真·ros2
CV-deeplearning11 天前
NVIDIA CV-CUDA:GPU 全流程加速计算机视觉,pip 一键安装替代 OpenCV,微软/腾讯/百度/字节全在用,云级图像处理吞吐量飙升 10 倍
opencv·计算机视觉·pip·nvidia·cuda·gpu加速·cv-cuda
OpenCSG16 天前
Cosmos3:NVIDIA 把世界模型做成了“理解、生成、模拟、行动”的统一入口
人工智能·大模型·nvidia·opencsg