SNiPER软件框架 与并行计算进展 邹佳恒 高能物理计算和软件会议,成都 2017.06.06
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
离线软件系统 基础软件库:离线软件的基石 数据处理系统:从实验“原始数据”到“物理成果”的输运工具 软件框架:连接物理学家与软件,并承载数据处理系统的桥梁
软件框架 VS. 软件库 定位 使用方式 软件框架代表了领域内软件复用的新高度 软件库着眼于处理某一个问题 软件框架着眼于处理某一领域问题 软件库(函数)由用户调用,是用户搭建自己软件大厦的砖块 软件框架反向调用用户代码 软件框架中已确定了软件的主体执行逻辑 用户定义软件执行的具体细节 软件框架代表了领域内软件复用的新高度 介于传统软件库与完整软件产品之间的“半成品” 高度模块化,易扩展 用户能够更专注于具体问题(如数据处理算法)
SNiPER软件框架的发展历史 Gaudi软件框架(引入吸收) BOSS & NuWa LAF轻量级物理分析框架(自主开发) 由CERN为LHCb实验开发 国内使用:BESIII(BOSS)和大亚湾(NuWa) 功能强大、完善,带给我们很多启发 LAF轻量级物理分析框架(自主开发) 专为大亚湾实验物理分析开发 针对中微子实验中特殊需求进行设计 SNiPER v1 在LAF基础上的功能扩充 SNiPER v2 大量新设计、新思想,功能逐渐完善 增强通用性 BOSS & NuWa LAF Gaudi JUNO早期 ... SNiPER v1 JUNO & LHAASO SNiPER v2
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
开发与使用环境 C++与Python混合语言编程 包管理工具CMT 代码管理:CVS 和 Git 大量基于C++的高能物理通用软件:ROOT、Geant4 … 混合编程是高能物理领域内的发展潮流 > C++用于实现核心功能,保证系统运行效率 > Python用于作业配置,高度灵活并具有高可集成性 包管理工具CMT 帮助开发者处理软件编译时的各种问题(如依赖关系等) 帮助用户设置软件运行环境 代码管理:CVS 和 Git
SNiPER的层次结构 SNiPER In an User Algorithm: I/O: disk, DB, network, grid… get data from memory execute calculation put results back to memory I/O: disk, DB, network, grid… Collect algorithm results Prepare data to be processed features such as geometry … No need to care where the data comes from No need to care where the data will go User’s Application Layer(用户代码层) Core Software Layer(核心层) Python UI Layer(用户配置层) Configure and run a job
SNiPER核心功能 I 问题分解与模块化 动态加载和配置 模块的运行时管理 借鉴Gaudi经验,将问题归纳为“算法”和“服务”等概念 强内聚:一个软件包(模块)专注于解决一个主要问题 弱耦合:模块与框架、模块与模块之间仅通过接口通信 动态加载和配置 不同模块可按需进行灵活组合,实现各种不同计算任务 借助Python接口可做软件参数的运行时配置 避免对代码的反复修改和编译 模块的运行时管理 模块的实例管理、状态维护、调用执行等
SNiPER核心功能 II 事例数据I/O接口与内存管理 基于事例循环的流程控制(Task) 基于消息的流程控制(Incident) 事例在内存中的生命周期管理,避免内存泄露等严重问题 基于事例循环的流程控制(Task) 算法序列的顺序执行 基于消息的流程控制(Incident) 流程的跳跃执行,可实现子算法序列的按需执行等复杂功能 分级的日志功能 每个模块的日志输出级别可独立设置 方便用户为软件调试而设置日志信息的多少
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
Task组织结构的扁平化 取消Task组织的树形结构 树形结构带来复杂性,但JUNO等实验实践中均未应用2层以上结构 增加TopTask派生类,可最多实现2层Task结构 单Task作业不会体会到任何变化,多Task作业需由TopTask实例开始 新的类继承关系示意图 新的类包含关系示意图
重构状态管理功能 明确系统在各状态间的转换关系,由独立的状态机负责状态管理 添加Ready等新状态和暂停等新操作(可能有助于多线程并行计算等 模式下的执行)
开发和使用的体验提升 适配C++11标准 优化执行逻辑 改良错误警告信息 需g++4.8以上版本编译器(尚未在JUNO等实验中实际应用) 采用新标准重写了大量代码,使代码更简练易读 优化执行逻辑 作业配置阶段(initialize之前)发现的错误,都用异常立即中断执行, 避免因疏忽而运行了错误配置的作业 从初始化开始,特别是事例处理中,发现错误后尽可能优雅退出执行 改良错误警告信息 日志与异常进行集成 程序退出时检查软件系统错误状态 在日志结尾给出明确错误信息,帮助定位错误和调试软件
其它重要变化 核心类型Task的重构 新的辅助类型 添加AlgSupervisor/SvcSupervisor等新的管理类 明确Task类型的分工,将StateMachine等功能独立实现,使Task的定 位更为清晰和易于理解 新的辅助类型 SniperScope,帮助用户对消息等功能进行定位 SniperContext,全局状态记录
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
SNiPER多线程计算的设计思想 SNiPER具有技术后发优势 SNiPER多线程计算的努力方向 SNiPER支持同时存在多个Task实例,可以方便的对应到不同线程上 SNiPER多线程计算的努力方向 以非侵入的方式实现多线程并行计算 多线程相关的主体代码在核心层代码(SniperKernel)之外实现 核心层代码不依赖多线程环境,完全兼容已有串行代码 尽可能少的修改用户接口,避免用户代码大规模改动 采用已经开源的Intel TBB任务并行软件库
SNiPER多线程计算设计 • • • Muster Multiple SNiPER Task Scheduler SniperTbbTask Mapping of a SNiPER Task to a TBB Task Global Res. Global Resources such as Element Factory Thread Local Resource Copies Muster spawn ( N ) SniperTbbTask in Thread #1 Algorithm Algorithm #1.1 Service #1.1 SniperTbbTask in Thread #2 Algorithm #2.1 Service #2.1 • • • Global Res. I/O Factory
目前开发状态 SniperMuster的实现 SniperKernel核心功能的增强 SNiPER (Top)Task与TBB task的一一映射 主要类型定义如下: SniperKernel核心功能的增强 线程安全的日志机制 基于“线程”的消息机制:将原来全局的Incident Manager修改为每 个“线程”对应一个Incident Manager
运行测试 以HelloWorld算法为例,暂不考虑内存管理与I/O等共享资源 定义一个线程内的函数,几乎与配置串行作业一样 调用Muster开启多线程并执行
性能测试 使用”Example/HelloWorld”算法(没有I/O),设置运行事例30,000,000 执行3次的平均时间(4核CPU): TBB线程数 运行时间(s) 1 20.94 2 12.50 4 7.43 串行执行(不使用Muster) 18.82
总结与下一步计划 进展总结 未来计划 对SNiPER核心功能做了大量改进,包括使用C++11新标准等 多线程环境下的数据I/O和内存管理 JUNO等实验中的实践应用
Thanks !