Download presentation
Presentation is loading. Please wait.
1
SNiPER软件框架 与并行计算进展 邹佳恒 高能物理计算和软件会议,成都
2
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
3
离线软件系统 基础软件库:离线软件的基石 数据处理系统:从实验“原始数据”到“物理成果”的输运工具
软件框架:连接物理学家与软件,并承载数据处理系统的桥梁
4
软件框架 VS. 软件库 定位 使用方式 软件框架代表了领域内软件复用的新高度 软件库着眼于处理某一个问题 软件框架着眼于处理某一领域问题
软件库(函数)由用户调用,是用户搭建自己软件大厦的砖块 软件框架反向调用用户代码 软件框架中已确定了软件的主体执行逻辑 用户定义软件执行的具体细节 软件框架代表了领域内软件复用的新高度 介于传统软件库与完整软件产品之间的“半成品” 高度模块化,易扩展 用户能够更专注于具体问题(如数据处理算法)
5
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
6
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
7
开发与使用环境 C++与Python混合语言编程 包管理工具CMT 代码管理:CVS 和 Git
大量基于C++的高能物理通用软件:ROOT、Geant4 … 混合编程是高能物理领域内的发展潮流 > C++用于实现核心功能,保证系统运行效率 > Python用于作业配置,高度灵活并具有高可集成性 包管理工具CMT 帮助开发者处理软件编译时的各种问题(如依赖关系等) 帮助用户设置软件运行环境 代码管理:CVS 和 Git
8
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
9
SNiPER核心功能 I 问题分解与模块化 动态加载和配置 模块的运行时管理 借鉴Gaudi经验,将问题归纳为“算法”和“服务”等概念
强内聚:一个软件包(模块)专注于解决一个主要问题 弱耦合:模块与框架、模块与模块之间仅通过接口通信 动态加载和配置 不同模块可按需进行灵活组合,实现各种不同计算任务 借助Python接口可做软件参数的运行时配置 避免对代码的反复修改和编译 模块的运行时管理 模块的实例管理、状态维护、调用执行等
10
SNiPER核心功能 II 事例数据I/O接口与内存管理 基于事例循环的流程控制(Task) 基于消息的流程控制(Incident)
事例在内存中的生命周期管理,避免内存泄露等严重问题 基于事例循环的流程控制(Task) 算法序列的顺序执行 基于消息的流程控制(Incident) 流程的跳跃执行,可实现子算法序列的按需执行等复杂功能 分级的日志功能 每个模块的日志输出级别可独立设置 方便用户为软件调试而设置日志信息的多少
11
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
12
Task组织结构的扁平化 取消Task组织的树形结构 树形结构带来复杂性,但JUNO等实验实践中均未应用2层以上结构
增加TopTask派生类,可最多实现2层Task结构 单Task作业不会体会到任何变化,多Task作业需由TopTask实例开始 新的类继承关系示意图 新的类包含关系示意图
13
重构状态管理功能 明确系统在各状态间的转换关系,由独立的状态机负责状态管理
添加Ready等新状态和暂停等新操作(可能有助于多线程并行计算等 模式下的执行)
14
开发和使用的体验提升 适配C++11标准 优化执行逻辑 改良错误警告信息 需g++4.8以上版本编译器(尚未在JUNO等实验中实际应用)
采用新标准重写了大量代码,使代码更简练易读 优化执行逻辑 作业配置阶段(initialize之前)发现的错误,都用异常立即中断执行, 避免因疏忽而运行了错误配置的作业 从初始化开始,特别是事例处理中,发现错误后尽可能优雅退出执行 改良错误警告信息 日志与异常进行集成 程序退出时检查软件系统错误状态 在日志结尾给出明确错误信息,帮助定位错误和调试软件
15
其它重要变化 核心类型Task的重构 新的辅助类型 添加AlgSupervisor/SvcSupervisor等新的管理类
明确Task类型的分工,将StateMachine等功能独立实现,使Task的定 位更为清晰和易于理解 新的辅助类型 SniperScope,帮助用户对消息等功能进行定位 SniperContext,全局状态记录
16
主要内容 软件框架概述 SNiPER简介 近期功能更新 并行计算开发进展 计划与总结
17
SNiPER多线程计算的设计思想 SNiPER具有技术后发优势 SNiPER多线程计算的努力方向
SNiPER支持同时存在多个Task实例,可以方便的对应到不同线程上 SNiPER多线程计算的努力方向 以非侵入的方式实现多线程并行计算 多线程相关的主体代码在核心层代码(SniperKernel)之外实现 核心层代码不依赖多线程环境,完全兼容已有串行代码 尽可能少的修改用户接口,避免用户代码大规模改动 采用已经开源的Intel TBB任务并行软件库
18
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
19
目前开发状态 SniperMuster的实现 SniperKernel核心功能的增强
SNiPER (Top)Task与TBB task的一一映射 主要类型定义如下: SniperKernel核心功能的增强 线程安全的日志机制 基于“线程”的消息机制:将原来全局的Incident Manager修改为每 个“线程”对应一个Incident Manager
20
运行测试 以HelloWorld算法为例,暂不考虑内存管理与I/O等共享资源 定义一个线程内的函数,几乎与配置串行作业一样
调用Muster开启多线程并执行
21
性能测试 使用”Example/HelloWorld”算法(没有I/O),设置运行事例30,000,000
执行3次的平均时间(4核CPU): TBB线程数 运行时间(s) 1 20.94 2 12.50 4 7.43 串行执行(不使用Muster) 18.82
22
总结与下一步计划 进展总结 未来计划 对SNiPER核心功能做了大量改进,包括使用C++11新标准等
多线程环境下的数据I/O和内存管理 JUNO等实验中的实践应用
23
Thanks !
Similar presentations