邹佳恒 第十八届全国科学计算与信息化会议 • 威海,2017.07.05 SNiPER软件框架 多线程并行计算研究 邹佳恒 第十八届全国科学计算与信息化会议 • 威海,2017.07.05
主要内容 SNiPER软件框架概述 SNiPER多线程计算的设计和开发 原型系统的测试 总结与计划 基本思想 Intel TBB简介 SNiPER Muster的实现 I/O和内存管理的概念设计 原型系统的测试 总结与计划
离线软件系统 基础软件库:高能物理领域内被广泛使用的大量软件工具 数据处理系统:从实验“原始数据”到“物理成果”的输运工具 软件框架:连接物理学家与软件,并承载数据处理系统的桥梁
基于SNiPER的软件层次结构 SNiPER In an User Algorithm: 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软件框架概述 SNiPER多线程计算的设计和开发 原型系统的测试 总结与计划 基本思想 Intel TBB简介 SNiPER Muster的实现 I/O和内存管理的概念设计 原型系统的测试 总结与计划
SNiPER多线程计算的基本需求 软件框架的特征 软件顶层设计 可靠性、稳定性、运行效率等软件系统基础特征 提供主体流程控制和用户层代码规范,不涉及具体的数据处理过程 核心层接口和功能的连续性,避免用户层代码大规模改动 软件顶层设计 能够兼容多种并行/异构计算技术(多线程、MPI、GPU等) 能够兼容串行/并行的用户层代码 用户层串行代码(需满足少量规范),由框架核心层提供并行计算能力 支持多种形式的用户层并行代码(TBB、OpenMP、Raw Thread等) 对用户(近似)透明,从串行计算向并行计算迁移的代价足够小
SNiPER多线程计算的设计思想 SNiPER的技术后发优势 SNiPER多线程计算的努力方向 SNiPER支持相互独立的多个Task实例,能够直观对应到不同线程上 SNiPER多线程计算的努力方向 以非侵入的方式实现多线程并行计算 多线程相关的主体代码在核心层代码(SniperKernel)之外实现 核心层代码不依赖多线程环境,兼容已有的用户层串行代码 尽可能少的修改用户接口,避免用户代码大规模改动 采用已经开源的Intel TBB任务并行软件库
Intel TBB简介 高层次的概念抽象,可应用于软件系统的顶层设计 Intel TBB task 能被独立分解,可并发执行的计算任务 轻量,相对线程能够以极高的效率创建和调度 Intel TBB task scheduler 处理TBB task实例之间的依赖关系和执行次序 负责线程间的负载平衡 忙碌线程上的task实例可迁移至空闲线程(任务窃取) 高层次的任务抽象能有效减少线程间通信和竞争
Intel TBB task 典型的task::state() 转换 基于TBB的软件设计 [ Ref: Intel TBB manual ] 基于TBB的软件设计 任务抽象和分解 创建大量task实例 交由task scheduler负责剩余的工作
多线程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
SNiPER核心层串行模式 高能物理传统串行软件核心控制流 基于事例循环 SNiPER核心模块默认方式 每次循环只处理一个事例 按顺序串行执行所有事例 SNiPER核心模块默认方式 begin end more events Y N execute
Muster with TBB task scheduler SNiPER Muster多线程模式 事例级并行,单个事例处理过程与串行运行模式一致 任务分解和映射 (SNiPER Task TBB task) 每个事例的计算过程映射为一个TBB task 数据I/O等异步操作也映射为不同的TBB task类型 begin end more events N Y I/O task Event 1 Event 2 Event 3 ••• Event N Global Buffer process task SNiPER exe Muster with TBB task scheduler
并行环境下的I/O概念设计 对每个I/O流使用单例模式 负责事例计算的各task实例与I/O解耦和 Singleton Input Task InputSvc Singleton Output Task OutputSvc Singleton GlobalBuffer Lock free push_back Lock free pop_front SniperTbbTask Task LocalBuffer ••• a portion of GlobalBuffer determined by current event
并行环境下的事例内存管理设计 Global Buffer:与I/O流绑定,通过缓存避免I/O wait和竞争,同时还可 用于保证事例的输出次序 Local Buffer:与串行模式Data Buffer相同,以兼容用户层串行代码 Thread 1 Thread 2 Thread 3 Thread 4
SNiPER Muster性能优化策略 TBB task objects的Recycling TBB的recycling机制能避免相同类型task对象的大量构造和析构 SNiPER Muster中用于事例计算的task对象数目与开启的线程数目 保持一致,并能持续重复使用 为I/O等异步操作构建更多的TBB task对象 合理利用TBB Scheduler Bypass 在确定的上下文环境中,开发者介入TBB task scheduler,实现对 task的更高效调度 是对TBB task默认调度方法的补充
主要内容 SNiPER软件框架概述 SNiPER多线程计算的设计和开发 原型系统的测试 总结与计划 基本思想 Intel TBB简介 SNiPER Muster的实现 I/O和内存管理的概念设计 原型系统的测试 总结与计划
用户层串行算法兼容性示范 以HelloWorld算法为例,暂不考虑内存管理与I/O等共享资源 定义一个待映射的SNiPER Task实例,几乎与配置串行作业一样 调用Muster开启多线程并执行
性能测试 执行3次的平均时间(4核CPU): 使用”HelloWorld”算法(没有I/O),运行事例30,000,000 event task任务分解的准确性和可靠性 event task实例的调度性能 执行3次的平均时间(4核CPU): TBB线程数 运行时间(s) 1 20.94 2 12.50 4 7.43 传统串行模式(w/o Muster) 18.82
进展总结与开发计划 进展总结 开发计划 基于Intel TBB实现了SNiPER Muster多线程计算原型系统 事例级的任务分解和映射 对SNiPER核心层模块非侵入式的设计和实现 对用户(近似)透明,极小化用户的迁移代价 开发计划 并行环境下的数据I/O和内存管理的实现 JUNO等实验中的实践应用
Thanks !