Wukai’s Lab Logo

C/C++ 与调试

  • 用 Valgrind 定位 C/C++ 内存问题:泄漏、越界与未初始化读取
    • 准备环境
    • 先建立排查顺序
    • 检测内存泄漏
      • 四种泄漏分类
      • 修复泄漏
    • 检测越界访问
    • 追踪未初始化值
    • 一组实用参数
    • Valgrind 与 Sanitizer 如何选择
    • 总结
  • 从函数拦截到调用计时:用 LD_PRELOAD 写一个 API Profiler
    • 实验设计:一个应用,两个动态库
    • 源码下载
    • 先编译运行,观察调用链
    • 同一个函数体,两个符号名
      • 业务库如何生成两个入口
      • wrapper 如何调用原始实现
    • weak 与 LD_PRELOAD 分别做了什么
    • 在 wrapper 中加入计时
      • 每次调用如何累计统计
      • 怎样解读统计字段
    • 手动编译:理解每个构建参数
    • 用符号表验证原理
    • 常见问题与使用边界

CUDA

  • NVLS:NCCL 如何借助 NVSwitch 做网络内归约
    • NVLS 是什么
    • 为什么集合通信需要它
    • 两条数据路径
      • 传统 GPU 归约
      • NVLS 归约
    • NVLS 与 NCCL 算法的关系
    • 适用条件与边界
    • 应用层怎么使用
      • Buffer registration 不是启用开关
    • 如何打开和确认 NVLS
      • 先看硬件拓扑
      • 再看 NCCL 版本和日志
      • 只在诊断时强制算法
    • 从 NCCL 调用到底层硬件
    • NVLS 的收益应该怎样测
    • 没有走 NVLS 时的排查顺序
    • 与 IB SHARP 的区别
    • 小结
  • CUDA Shared Memory Bank Conflict:从地址映射到 Padding 与 XOR Swizzling
    • Shared memory 为什么会发生冲突
      • 无冲突、冲突与广播
      • Stride 与冲突度
      • 宽数据类型不能只看数组下标
    • 矩阵转置为何需要 shared memory
      • 冲突发生在 tile 的列访问
    • 方案一:增加一列 Padding
    • 方案二:XOR Swizzling
      • 逻辑位置和物理位置
      • Swizzling 的映射函数
      • 一对一映射
      • 映射前后的取值范围保持不变
      • 同一逻辑列在映射后也互不冲突
      • 在转置 kernel 中应用映射
    • Padding 与 Swizzling 如何选择
    • 用 Nsight Compute 验证,而不是只看公式
    • 总结
    • 参考资料
  • CUDA 设备代码中的 long double:为什么不能把它当作扩展精度
    • 先把三个概念拆开
      • sizeof 不等于有效精度
      • 主机代码和设备代码由不同后端处理
      • 编译通过不等于受支持
    • 为什么原始字节实验容易误导
      • char 可能导致符号扩展
      • 填充字节不是数值证据
      • 设备与主机复制可能制造 ABI 陷阱
    • 分别验证主机表示和设备计算
    • 如果确实需要更高精度
    • 正确验证数值行为
    • 总结

开发工具

  • VS Code 开发环境配置:C/C++、Python 与远程开发
    • 先建立配置边界
    • C/C++ 与 CMake
      • 基础扩展
      • 格式化与诊断
    • Python
      • 核心扩展
    • Remote SSH
    • 通用编辑设置
    • 可选扩展
    • 配置完成后的验收
    • 一套精简的配置顺序
    • 总结

浏览

  • 主题索引
    • C/C++
    • CUDA
    • 集合通信
    • 性能优化
    • 调试
    • 开发工具
    • VS Code
Wukai’s Lab
  • 主题索引
  • 在 GitHub 上编辑

主题索引

C/C++

  • 从函数拦截到调用计时:用 LD_PRELOAD 写一个 API Profiler

  • 用 Valgrind 定位 C/C++ 内存问题:泄漏、越界与未初始化读取

  • CUDA 设备代码中的 long double:为什么不能把它当作扩展精度

CUDA

  • NVLS:NCCL 如何借助 NVSwitch 做网络内归约

  • CUDA Shared Memory Bank Conflict:从地址映射到 Padding 与 XOR Swizzling

  • CUDA 设备代码中的 long double:为什么不能把它当作扩展精度

集合通信

  • NVLS:NCCL 如何借助 NVSwitch 做网络内归约

性能优化

  • 从函数拦截到调用计时:用 LD_PRELOAD 写一个 API Profiler

  • CUDA Shared Memory Bank Conflict:从地址映射到 Padding 与 XOR Swizzling

  • NVLS:NCCL 如何借助 NVSwitch 做网络内归约

调试

  • 从函数拦截到调用计时:用 LD_PRELOAD 写一个 API Profiler

  • 用 Valgrind 定位 C/C++ 内存问题:泄漏、越界与未初始化读取

开发工具

  • VS Code 开发环境配置:C/C++、Python 与远程开发

VS Code

  • VS Code 开发环境配置:C/C++、Python 与远程开发

上一页

© 版权所有 2026, Wukai。 最后更新于 2026-10-01.