大规模并行程序调试及优化—方法、工具及实践
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
¨ ¨
源于牛津大学的新一代并行调试工具 创新的理念,十年的发展
¤ ¤ ¤ ¤
¤ ¤
2004 DDT1.0 — 创新界面设计颠覆了市场原有产品理念 2005 新的许可模式:超级计算许可证支持 2006 OPT — 业内首个并行开发套件,包括并行优化功能 2010 DDT 2.6 — 首个可扩展并行调试工具,有效支持3.5万个并行进程 ;CUDA支持 2011 DDT 3.0 — 业内首个也是唯一一个面向千万亿次系统的并行调试工具 2012 DDT 3.2 — CUDA 4.2,更强大的可视化支持
大规模并行调试的挑战
• 计算规模增大导致的新问题
– 海量数据导致的数据错误 – 如Garbage in garbage out, 溢值 – 逻辑以及控制流 – 增大的独立随机错误可能
• 内存错误/耗尽 – “随机” 错误 • 系统问题 – MPI ,操作系统
– 挑战编程极限,算法(可靠性、稳定性、高性能) – 其他未知问题……
大规模并行程序调试及优化
——方法、工具及实践
姚继锋 博士
中国科学院软件研究所 中科嘉速(北京)并行软件有限公司
2013.03.15 北京
天才的程序员
中国第一个女程序员 ¨ 我国第一颗人造卫星地 面追踪程序的作者 ¨ 以一次通过、零Bug的 惊人编程能力为人乐道
并行性能优化工具比较依据
¨
是否具备广泛的适用性
¤ C/C++/Fortran,多线程/OpenMP/MPI,Intel/AMD/Power
¨
是否获得必要及详尽的性能分析数据
¤ 函数/代码行/汇编/CPU特定计数器,计算/通讯/IO
¨
是否具备良好的性能数据展现
¨
过去一年内的部分用户
进程间数据比对
• 分析获取当前进程组中每个进程表达式值 • 进程间数据比对 • 对源于不同进程数据自动分组 • 自动统计 nan和 inf情况 • 快捷识别出错进程
超大规模数据可视化
• 大数组支持 • 数组查看
– 1, 2, 3… 更多维 – 数据列表
• 数据过滤
– 当前代码行
– 本地/局部变量 – 任意变量查看 – Fortran数据支持 – C++ STL支持 – (多维)数组查看 – 指针查看 – 数据统计 – 线程和进程间数据 – 堆栈数据 – 数据更改
¨
程序运行控制
¤ ¤ ¤ ¤ ¤ ¤
• 消息队列
¨
有些事情变困难了
¤ 算法的设计 ¤ 语言和工具的选择 ¤ 程序调试和性能评估
并行程序调试的困难
错误可能出现在任意一个进程 ¨ 错误可能与并行规模数相关 ¨ 错误可能与运行环境相关 ¨ 错误可能与通讯相关
¨ ¨
如果调试4个进程不是问题,40个,4000个呢?
– 快速定位异常数据
• 数据导出
– 存储为电子表
• 多进程数据处理
– TB级数组并行检索异常数据
Tracepoints
• 执行过程中智能记录并合并变量历史 • “Scalable printf”:
– 无需重新编译代码 – 合并功能避免输出过多:网络以及用户界面 – 设定输出过滤条件
• 同时显示代码行及相应数据,无需重 新编译代码 • 保存输出便于后续分析
¨ ¨
代码插桩
性能计数器度量
性能分析
性能展示 性能优化
性能优化工具本身并不 能直接优化代码性能, 而是辅助定位性能瓶颈
传统程序优化方式
Profiling,寻找性能热点 ¨ -‐pg选项
¨ ¨
串行足够,但对并行
¤ 难以在进程间进行分析 ¤ 难以优化通讯瓶颈 ¤ 需要可视化展现
Memory Hierarchy
寄存器
●
Operands Instructions 缓存 Lines Blocks 本地内存 Messages 远程内存 Pages 磁盘 磁带
●
●
算法改进
代码改进:10%~数倍 ¨ 硬件性能发挥:数倍~十余倍 ¨ 算法改进:数十倍、数百倍、成千上万倍
– 队列查看 – 死锁检测
• 内存调试 • Checkpoints • CUDA支持 • 大规模并行支持
3.1/3.2版本的新特性
千万亿次架构—并行规模>20万核,集合通信时 间不足1秒 ¨ 大规模数据可视化功能—自动组合并图形化展 示源自多个进程的海量数组数据 ¨ 跟踪点功能—程序执行过程中智能记录并归并 变量历史 ¨ 支持CUDA 4.2
内存调试
定位内存泄漏
数组读写越界时自动终止:
MPI通讯调试:消息队列
• 依据通讯组查看 • 可选进程编号 • 红色—Send • 绿色—Receive • 蓝色—未知消息 • 死锁:环状消息
消息队列
Petascale 架构
DDT 3.0 Performance Figures
• GPU的支持 • 超大规模计算的支持
¨
强大的并行调试功能
¤ ¤ ¤ ¤
¨
丰富的支持
¤ ¤ ¤
• 更方便 • 更智能 • 更强大
¨
方便易用
Allinea DDT— Distributed Debugger Tool
• 与ORNL针对美洲豹系统开发 • 新型树架构,对数级性能 • 许多操作22万核性能优于原来1000核性能 • 22万核步进更新堆栈信息<~1/10秒
0.06 0.12
DDT 3.0 Performance Figures
Jaguar XT5
0.1
0.08
All Step All Breakpoint
• 超大规模并行程序调试成为可能!
0.04
0.02
Time (Seconds)
0 0 50,000 100,000 150,000 MPI Processes 200,000
大规模并行程序性能分析及优化
数学物 理模型
原始 代码
并行算 法设计
并行软 件实现
程序性 能优化
软件 应用
从串行到并行设计…
¨
多了一些事情
¤ 分析应用的分类 ¤ 选择并行程序的范例 ¤ 选择并行机体系结构和物理机模型 ¤ 考虑同步、负载平衡和终止检测
¤ 代码树性能、计算/通讯/IO性能、直观易用、大规模并行
展现……
¨
是否对并行程序常见并行性能瓶颈有深入理解并提 供针对性功能
¤ MPI通讯性能、负载均衡、串并行比率、不同并行规模
• 袁国兴老师多次报告九所超大规模计算的经验和体会
应对方法
• 改进的编程规范
– 良好的编程习惯,开发组内统一一的开发规范 – 单元测试, 断言 – 专职测试角色
• Logging – printf 及 write
– 最常见、有效的调试途径 – Biblioteka Baidu问题有良好的判断,选择合适变量输出 – 条件输出 – 输出结果的二次处理,脚本语言
MS、Pipeline、WP、SYN、DC 设计并行算法 考虑同步、负载平衡和终止检测 选择语言、工具实现 调试、优化 SM SMP PVP DM DSM
并行编程的范例
并行机体系结构 物理机模型
硬件
MPP Cluster DSM
课题研究思路和技术路线
如何获得高的性能?
¨ ¨ ¨
充分发挥硬件特性:Cache、流水、向量部件 充分利用软件特性:软件性能优化方法和技巧 充分发挥人的特性:更高效的算法
矩阵乘法 C=A×B
C语言使用:编程技巧和习惯
使用数组而不是指针,a[10],not *a ¨ 打开小的循环 ¨ 分支判断条件的选择和排序 ¨ 变量字长对齐 ¨ 尽可能减少计算量:临时变量、乘法取代除法
¤ 算法瓶颈 ¤ 循环、向量化、数据局部化等软件实现瓶颈 ¤ 内存访问 ¤ IO瓶颈
¨
并行程序
¤ 串行占优瓶颈 ¤ 同步、锁等线程瓶颈 ¤ MPI通讯瓶颈 ¤ 负载均衡瓶颈
性能优化流程
制定性能数据采集策略 ¨ 采集性能数据 ¨ 性能数据分析 ¨ 性能数据可视化展现 ¨ 确认性能瓶颈及原因 ¨ 手动性能优化
• 小规模重现错误
– 小数据、小规模可能无法触发错误 – 会不会是系统问题 – 比如,MPI导致的?
使用调试工具
• GDB系列
– 免费,功能齐备 – 不能很好的支持并行程序调试
使用调试工具
• GDB系列
– 免费,功能齐备 – 不能很好的支持并行程序调试
– 专业的并行程序调试工具
¨ ¨
充分发挥语言和编译器特性
从分级存储看应用性能
●
HPL: linear system solve Ax = b STREAM: vector operations A=B+s*C FFT: 1D Fast Fourier Transform Z = fft(X) RandomAccess: integer update T[i] = XOR( T[i], rand)
• 小规模重现错误
– 使用少量节点,期待错误再现 – 脚本提交不同规模计算任务,同时记录输出结果
可能面临的问题
• 增加单元测试, 断言
– 覆盖率总是有限,无法捕捉随机或系统错误
• Logging – printf 及 write
– 需要修改并重新编译程序 – 需要灵感和天赋去确定输出的变量 – 需要从数百、数千乃至数十万行输出大海中捞针 – 发现输出错误 ≠ 定位代码错误
¨ ¨
可望而不可及
张绮霞研究员
中科院计算中心,中科院软件所
串行程序设计
应用
问题
设计算法
软件设计
选择语言、工具实现 调试、优化
硬件
并行程序设计
问题
应用
紧耦合
松耦合
易并行
并行应用的分类模型
软件设计
¨
排序:O(N2) à O(NlogN) 2 ¨ FFT:O(N )à O(NlogN) 3 2.807) à O(N2.376) ¨ 矩阵乘法:O(N ) à O(N
¨
常见性能瓶颈
¨
串行程序
主要功能
¨
多种运行方式支持 • 变量和数据控制
¤ ¤
• 输入和输出
– 即时输出信息 – 进程选择 – 即时输入
本地/远程/作业调度 启动/已运行/core 进程分组 步进 各类断点 Watchpoints Tracepoints Parallel stack view
– Totalview – Allinea DDT
对并行调试工具的需求
¨
完备的基础调试功能
¤
断点、步进、跟踪、定位 多进程、线程的控制 进程间的比对 通讯的掌控 …… C/C++/Fortran 各种并行模式 各种运行环境
源于牛津大学的新一代并行调试工具 创新的理念,十年的发展
¤ ¤ ¤ ¤
¤ ¤
2004 DDT1.0 — 创新界面设计颠覆了市场原有产品理念 2005 新的许可模式:超级计算许可证支持 2006 OPT — 业内首个并行开发套件,包括并行优化功能 2010 DDT 2.6 — 首个可扩展并行调试工具,有效支持3.5万个并行进程 ;CUDA支持 2011 DDT 3.0 — 业内首个也是唯一一个面向千万亿次系统的并行调试工具 2012 DDT 3.2 — CUDA 4.2,更强大的可视化支持
大规模并行调试的挑战
• 计算规模增大导致的新问题
– 海量数据导致的数据错误 – 如Garbage in garbage out, 溢值 – 逻辑以及控制流 – 增大的独立随机错误可能
• 内存错误/耗尽 – “随机” 错误 • 系统问题 – MPI ,操作系统
– 挑战编程极限,算法(可靠性、稳定性、高性能) – 其他未知问题……
大规模并行程序调试及优化
——方法、工具及实践
姚继锋 博士
中国科学院软件研究所 中科嘉速(北京)并行软件有限公司
2013.03.15 北京
天才的程序员
中国第一个女程序员 ¨ 我国第一颗人造卫星地 面追踪程序的作者 ¨ 以一次通过、零Bug的 惊人编程能力为人乐道
并行性能优化工具比较依据
¨
是否具备广泛的适用性
¤ C/C++/Fortran,多线程/OpenMP/MPI,Intel/AMD/Power
¨
是否获得必要及详尽的性能分析数据
¤ 函数/代码行/汇编/CPU特定计数器,计算/通讯/IO
¨
是否具备良好的性能数据展现
¨
过去一年内的部分用户
进程间数据比对
• 分析获取当前进程组中每个进程表达式值 • 进程间数据比对 • 对源于不同进程数据自动分组 • 自动统计 nan和 inf情况 • 快捷识别出错进程
超大规模数据可视化
• 大数组支持 • 数组查看
– 1, 2, 3… 更多维 – 数据列表
• 数据过滤
– 当前代码行
– 本地/局部变量 – 任意变量查看 – Fortran数据支持 – C++ STL支持 – (多维)数组查看 – 指针查看 – 数据统计 – 线程和进程间数据 – 堆栈数据 – 数据更改
¨
程序运行控制
¤ ¤ ¤ ¤ ¤ ¤
• 消息队列
¨
有些事情变困难了
¤ 算法的设计 ¤ 语言和工具的选择 ¤ 程序调试和性能评估
并行程序调试的困难
错误可能出现在任意一个进程 ¨ 错误可能与并行规模数相关 ¨ 错误可能与运行环境相关 ¨ 错误可能与通讯相关
¨ ¨
如果调试4个进程不是问题,40个,4000个呢?
– 快速定位异常数据
• 数据导出
– 存储为电子表
• 多进程数据处理
– TB级数组并行检索异常数据
Tracepoints
• 执行过程中智能记录并合并变量历史 • “Scalable printf”:
– 无需重新编译代码 – 合并功能避免输出过多:网络以及用户界面 – 设定输出过滤条件
• 同时显示代码行及相应数据,无需重 新编译代码 • 保存输出便于后续分析
¨ ¨
代码插桩
性能计数器度量
性能分析
性能展示 性能优化
性能优化工具本身并不 能直接优化代码性能, 而是辅助定位性能瓶颈
传统程序优化方式
Profiling,寻找性能热点 ¨ -‐pg选项
¨ ¨
串行足够,但对并行
¤ 难以在进程间进行分析 ¤ 难以优化通讯瓶颈 ¤ 需要可视化展现
Memory Hierarchy
寄存器
●
Operands Instructions 缓存 Lines Blocks 本地内存 Messages 远程内存 Pages 磁盘 磁带
●
●
算法改进
代码改进:10%~数倍 ¨ 硬件性能发挥:数倍~十余倍 ¨ 算法改进:数十倍、数百倍、成千上万倍
– 队列查看 – 死锁检测
• 内存调试 • Checkpoints • CUDA支持 • 大规模并行支持
3.1/3.2版本的新特性
千万亿次架构—并行规模>20万核,集合通信时 间不足1秒 ¨ 大规模数据可视化功能—自动组合并图形化展 示源自多个进程的海量数组数据 ¨ 跟踪点功能—程序执行过程中智能记录并归并 变量历史 ¨ 支持CUDA 4.2
内存调试
定位内存泄漏
数组读写越界时自动终止:
MPI通讯调试:消息队列
• 依据通讯组查看 • 可选进程编号 • 红色—Send • 绿色—Receive • 蓝色—未知消息 • 死锁:环状消息
消息队列
Petascale 架构
DDT 3.0 Performance Figures
• GPU的支持 • 超大规模计算的支持
¨
强大的并行调试功能
¤ ¤ ¤ ¤
¨
丰富的支持
¤ ¤ ¤
• 更方便 • 更智能 • 更强大
¨
方便易用
Allinea DDT— Distributed Debugger Tool
• 与ORNL针对美洲豹系统开发 • 新型树架构,对数级性能 • 许多操作22万核性能优于原来1000核性能 • 22万核步进更新堆栈信息<~1/10秒
0.06 0.12
DDT 3.0 Performance Figures
Jaguar XT5
0.1
0.08
All Step All Breakpoint
• 超大规模并行程序调试成为可能!
0.04
0.02
Time (Seconds)
0 0 50,000 100,000 150,000 MPI Processes 200,000
大规模并行程序性能分析及优化
数学物 理模型
原始 代码
并行算 法设计
并行软 件实现
程序性 能优化
软件 应用
从串行到并行设计…
¨
多了一些事情
¤ 分析应用的分类 ¤ 选择并行程序的范例 ¤ 选择并行机体系结构和物理机模型 ¤ 考虑同步、负载平衡和终止检测
¤ 代码树性能、计算/通讯/IO性能、直观易用、大规模并行
展现……
¨
是否对并行程序常见并行性能瓶颈有深入理解并提 供针对性功能
¤ MPI通讯性能、负载均衡、串并行比率、不同并行规模
• 袁国兴老师多次报告九所超大规模计算的经验和体会
应对方法
• 改进的编程规范
– 良好的编程习惯,开发组内统一一的开发规范 – 单元测试, 断言 – 专职测试角色
• Logging – printf 及 write
– 最常见、有效的调试途径 – Biblioteka Baidu问题有良好的判断,选择合适变量输出 – 条件输出 – 输出结果的二次处理,脚本语言
MS、Pipeline、WP、SYN、DC 设计并行算法 考虑同步、负载平衡和终止检测 选择语言、工具实现 调试、优化 SM SMP PVP DM DSM
并行编程的范例
并行机体系结构 物理机模型
硬件
MPP Cluster DSM
课题研究思路和技术路线
如何获得高的性能?
¨ ¨ ¨
充分发挥硬件特性:Cache、流水、向量部件 充分利用软件特性:软件性能优化方法和技巧 充分发挥人的特性:更高效的算法
矩阵乘法 C=A×B
C语言使用:编程技巧和习惯
使用数组而不是指针,a[10],not *a ¨ 打开小的循环 ¨ 分支判断条件的选择和排序 ¨ 变量字长对齐 ¨ 尽可能减少计算量:临时变量、乘法取代除法
¤ 算法瓶颈 ¤ 循环、向量化、数据局部化等软件实现瓶颈 ¤ 内存访问 ¤ IO瓶颈
¨
并行程序
¤ 串行占优瓶颈 ¤ 同步、锁等线程瓶颈 ¤ MPI通讯瓶颈 ¤ 负载均衡瓶颈
性能优化流程
制定性能数据采集策略 ¨ 采集性能数据 ¨ 性能数据分析 ¨ 性能数据可视化展现 ¨ 确认性能瓶颈及原因 ¨ 手动性能优化
• 小规模重现错误
– 小数据、小规模可能无法触发错误 – 会不会是系统问题 – 比如,MPI导致的?
使用调试工具
• GDB系列
– 免费,功能齐备 – 不能很好的支持并行程序调试
使用调试工具
• GDB系列
– 免费,功能齐备 – 不能很好的支持并行程序调试
– 专业的并行程序调试工具
¨ ¨
充分发挥语言和编译器特性
从分级存储看应用性能
●
HPL: linear system solve Ax = b STREAM: vector operations A=B+s*C FFT: 1D Fast Fourier Transform Z = fft(X) RandomAccess: integer update T[i] = XOR( T[i], rand)
• 小规模重现错误
– 使用少量节点,期待错误再现 – 脚本提交不同规模计算任务,同时记录输出结果
可能面临的问题
• 增加单元测试, 断言
– 覆盖率总是有限,无法捕捉随机或系统错误
• Logging – printf 及 write
– 需要修改并重新编译程序 – 需要灵感和天赋去确定输出的变量 – 需要从数百、数千乃至数十万行输出大海中捞针 – 发现输出错误 ≠ 定位代码错误
¨ ¨
可望而不可及
张绮霞研究员
中科院计算中心,中科院软件所
串行程序设计
应用
问题
设计算法
软件设计
选择语言、工具实现 调试、优化
硬件
并行程序设计
问题
应用
紧耦合
松耦合
易并行
并行应用的分类模型
软件设计
¨
排序:O(N2) à O(NlogN) 2 ¨ FFT:O(N )à O(NlogN) 3 2.807) à O(N2.376) ¨ 矩阵乘法:O(N ) à O(N
¨
常见性能瓶颈
¨
串行程序
主要功能
¨
多种运行方式支持 • 变量和数据控制
¤ ¤
• 输入和输出
– 即时输出信息 – 进程选择 – 即时输入
本地/远程/作业调度 启动/已运行/core 进程分组 步进 各类断点 Watchpoints Tracepoints Parallel stack view
– Totalview – Allinea DDT
对并行调试工具的需求
¨
完备的基础调试功能
¤
断点、步进、跟踪、定位 多进程、线程的控制 进程间的比对 通讯的掌控 …… C/C++/Fortran 各种并行模式 各种运行环境