Wukai’s Lab
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
搜索
请启用 JavaScript 以便使用搜索功能