大规模并行计算程序优化.pdf
大规模并行计算程序优化 高性能服务器产品部 应用支持处 1 刘羽 博士 主要内容 并行计算机体系结构 并行程序设计及编译优化 TAU分析器简介 2 并行计算机体系结构 并行计算机结构模型 根据指令流和数据流的不同,通常把计算机系统分为: 单指令单数据流 (SISD) ► 单指令多数据流 (SIMD) ► 多指令单数据流 (MISD) ► 多指令多数据流 (MIMD) ► 数据个数 D 并行计算机系统多大部分为MIMD系统,包括: 对称多处理机(SMP) ► 分布式共享存储多处理机(DSM) ► 大规模并行处理机(MPP) M SIMD MIMD S SISD MISD ► ► 3 机群(Cluster) S 个数 I M 指令 SMP- Symmetric MultiProcessing 多个CPU连接于统一的内存总线 内存地址统一编址,单一操作系统映像 可扩展性较差,一般CPU个数少于32个 目前商用服务器多采用这种架构 >4 CPUs may require switching Local Area Network CPUs Chipset CPUs CPUs CPUs Memory Bus Memory I/O Bus NIC 4 System DSM- Distributed Shared Memory 物理上分布存储、所有内存模块统一编址 非一致内存访问(NUMA)模式 基于Cache的数据一致性,又称CC-NUMA 节点数可扩展到几百个,小型机多为此类架构 CPUs CPUs Memory I/O Bus NIC I/O NUMA Link Chipset ... I/O Bus NIC I/O Memory Memory Bus Memory Bus Memory Bus Chipset CPUs Memory NUMA Link Chipset ... I/O Bus NIC I/O System Local Area Network 5 MPP- Massively Parallel Processors 节点个数可达成百上千个 节点类型可以是DM、SMP、DSM 节点之间采用专用高速互连设备 排列在Top500前面的多数系统属于这种类型 System System CPUs CPUs Memory 局部总线/互连网络 ... 局部总线/互连网络 Memory ... 局部总线/互连网络 I/O Bus NIC 专用高速互联 6 CPUs Memory I/O Bus NIC System I/O Bus NIC Cluster 独立的节点、商品化网络连接 开放的硬件设备、操作系统、应用编程接口 节点数可达几百个,性能已接近超级计算机系统 近年来发展很快,已广泛应用到高性能科学计算领域 System System CPUs CPUs Memory Bus Chipset Memory ... SAN CPUs Memory Bus Chipset I/O Bus LAN System Memory ... Chipset I/O Bus LAN Memory I/O Bus SAN System Area Network Local Area Network 7 Memory Bus LAN SAN 各种架构对比 ► ► ► 8 SMP瓶颈在访存带宽,限制了可扩展性(性能会严重下降), 通过增大Cache来缓解,又有数据一致性的问题。 DSM具有较好的可扩展性,且具有与SMP相同的编程模式。共 享存储的机器可以运行各种编程模式的程序,包括串行程序、 共享存储并行程序和消息传递并行程序。 共享存储的机器首先可以看作是一个内存扩充了的串行机器, 可以运行数据量极大的串行程序,如大数据量的数据库应用。 利用多个处理器的并行处理性能,自动并行(靠编译器)作用 有限,需要其他编程方式的应用,如OpenMP。 各种架构对比(续) 分布式存储体系结构 ► ► ► 9 无共享的机器,MPP和Cluster,具有最好的可扩展性,采用消息传 递编程,可编程性不如OpenMP,也可以通过DSM软件的方式来模 拟实现共享存储(其实还是通过消息传递,只不过对上层透明),性 能受到影响,但可以运行OpenMP应用程序。 MPP/PVP在构造大规模系统,应用饱和性能方面具有优势,资金充 足的依然会选择; Cluster由于无可比拟的性价比优势占据主流位置。 – 系统的高可用性 – 更高的计算能力 – 良好的可扩展性 – 更高的性价比 并行计算机访存模型 UMA(Uniform Memory Access)模型是均匀存储访问模型的 简称 NUMA(Nonuniform Memory Access)模型是非均匀存储访问模 型 COMA(Cache-Only Memory Access)模型是全高速缓存存储访 问的简称 CC-NUMA(Coherent-Cache Nonuniform Memory Access) 模型是高速缓存一致性非均匀存储访问模型的简称 NORMA(No-Remote Memory Access)模型是非远程存储访 问模型的简称 10 优秀高效的并行程序—困难 技术先行,缺乏理论指导 程序的语法/语义复杂, 需要用户自已处理 任务/数据的划分/分配 数据交换 同步和互斥 性能平衡 并行语言缺乏代可扩展和异构可扩展, 程序移植困难, 重写代码难度太大 环境和工具缺乏较长的生长期, 缺乏代可扩展和异构可扩展 11 并行化的基本思想—任务划分 原则: 使系统大部分时间忙于计算, 而不是闲置或忙于交互; 同时不牺 牲并行性(度). 划分: 切割数据和工作负载 分配:将划分好的数据和工作负载映射到计算结点(处理器)上 分配方式 ► 显式分配: 由用户指定数据和负载如何加载 ► 隐式分配:由编译器和运行时支持系统决定 就近分配原则:进程所需的数据靠近使用它的进程代码 12 并行化的基石—通信 通信方式 共享变量 父进程传给子进程(参数传递方式) 消息传递 同步:导致进程间相互等待或继续执行的操作 原子同步 控制同步(路障,临界区) 数据同步(锁,条件临界区,监控程序,事件) 聚集:用一串超步将各分进程计算所得的部分结果合并为一个完整的结 果, 每个超步包含一个短的计算和一个简单的通信或/和同步. 聚集方式: 归约 扫描 13 通信模式 一对一:点到点(point to point) 一对多:广播(broadcast),播撒(scatter) 多对一:收集(gather), 归约(reduce) 多对多:全交换(Tatal Exchange), 扫描(scan) , 置换/移位 (permutation/shift) 14 五种并行编程风范 相并行(Phase Parallel) 分治并行(Divide and Conquer Parallel) 流水线并行(Pipeline Parallel) 主从并行(Master-Slave Parallel) 工作池并行(Work Pool Parallel) 15 相并行(Phase Parallel) 一组超级步(相) 步内各自计算 步间通信、同步 BSP 方便差错和性能分析 计算和通信不能重叠 C C ...... C Synchronous Interaction C C ...... C Synchronous Interaction 16 主-从并行(Master-Slave Parallel) 主进程:串行、协调任务 子进程:计算子任务 划分设计技术 与相并行结合 主进程易成为瓶颈 Master Slave 17 Slave Slave 分治并行(Divide and Conquer Parallel) 父进程把负载分割并指派给子进程 递归 重点在于归并 分治设计技术 难以负载平衡 18 流水线并行(Pipeline Parallel) 一组进程 流水线作业 流水线设计技术 P1 P2 P3 19 工作池并行(Work Pool Parallel) 初始状态:一件工作 进程从池中取任务执行 可产生新任务放回池中 直至任务池为空 易与负载平衡 临界区问题(尤其消息传递) Work Pool P1 20 P2 P3 程序优化 21 级别 优化层 优化目标 关注问题 工具 1 硬件-系统 通过查看系统 CPU/内存, 层 网络,磁盘IO 资源使用情 况,了解应用 等 特点 系统命令, TOP,PS,IOSTAT,VMSTAT 等 2 应用层 应用算法-代 进程-线程 码级(算法优 锁,数据结构 秀,考虑到硬 等 件结构) Intel Thread Profiler TBB Intel Trace collector & Analyzer 3 微架构层 依硬件特点, 指令集、 充分发挥系统 cache大小、 的资源 资源参数等 Intel Compiler, Intel MPI, MKL 程序编译 ► 使用最新版的Intel Compiler,及相应的优化选项 针对通用的性能优化:-O, -O0, -O1, -O2, -O3, –static, -static- intel, -fast 针对向量化:-xS, -xT(Core), -xP(NetBurst), -xSSE4.2, - xSSE4.1, -xAVX, -mtune= …… 针对Cache Miss: -fno-alias 高级优化选项:-ip/-ipo , -prof-gen / -prof-use 串行程序并行化:-openmp, -parallel 其他优化:-no-prec-div, -no-prec-sqrt, …… ► 使用最新版的Intel MKL,及其提供的常用数学库 函数调用接口一致,直接连接库文件即可 最大的避免了Cache Miss等性能问题 最大限度使用处理器内部资源,比如SSE处理单元,64位扩展寄存器等 MKL提供的常用数学函数:FFT , BLAS , LAPACK , … 22 并行作业提交 mpiexec -genv I_MPI_DYNAMIC_CONNECTION 0-genv I_MPI_ADJUST_BCAST '4:0-380473;7:380473-4194304'-genv I_MPI_ADJUST_BARRIER '4'-genv I_MPI_ADJUST_GATHER '2:0173;3:173-4194304'-genv I_MPI_ADJUST_ALLGATHER '1:0- 384;3:384-4194304'-genv I_MPI_ADJUST_ALLGATHERV '1:0224;3:224-4194304'-genv I_MPI_ADJUST_SCATTER '2:0-226;3:2264194304'-genv I_MPI_ADJUST_SCATTERV 2-genv I_MPI_ADJUST_REDUCE '4:0-3925;4:3925-4160;3:416014004;4:14004-29771;3:29771-162610;1:162610-4194304'-genv I_MPI_ADJUST_REDUCE_SCATTER '5:0-0;4:0-23;1:23-45;3:454194304'-genv I_MPI_ADJUST_ALLTOALL '4:0-8;1:8-210;4:210- 345;2:345-704;3:704-1588;2:1588-3503187;3:3503187-4194304'genv I_MPI_ADJUST_ALLTOALLV 1 23 What is TAU? Tuning and Analysis Department of Computer and Information Science, University of Oregon Advanced Computing Laboratory Los Alamos National Laboratory NM Research Centre Juelich, ZAM, Germany http://tau.uoregon.edu 24 TAU is a performance evaluation tool It supports parallel profiling and tracing toolkit Profiling shows you how much (total) time was spent in each routine Tracing shows you when the events take place in each process along a timeline Profiling and tracing can measure time as well as hardware performance counters from your CPU TAU can automatically instrument your source code (routines,loops,I/O,memory,phases,etc.) TAU runs on all HPC platforms and it is free (BSD style license) TAU has instrumentation, measurement and analysis tools Using TAU requires setting a couple of environment variables and substituting the name of the compiler with a TAU shell script 25 How to use TAU? Dynamic instrumentation through library pre-loading TAU scripted compilation Selectively Profiling 26 library pre-loading tau_exec –io YourPrograms mpirun –np 4 tau_exec –io YourPrograms 27 -v Verbose mode -io Track I/O -memory Track memory -cuda Track GPU events via CUDA -opencl Track GPU events via OpenCL TAU scripted compilation tau_f90.sh –tau_makefile=/opt/TAU/x86_64/ lib/Makefile_pdt_mpi –tau_options=-optVerbose – optDetectMemoryLeaks –optRevert –o exe yourprogram.f90 -optVerbose Turn on verbose debugging message -optDetectMemoryLeaks Track mallocs/frees using TAU's memory wrapper -optPdtGnuFortranParser Specify the GNU gfortran PDT parser gfparse instead of f95parse -optPdtCleanscapeParser Specify the Cleanscape Fortran parser -optTauSelectFile="" Specify selective instrumentation file for tau_instrumentor -optPreProcess Preprocess the source code before parsing. Uses /usr/bin/cpp -P by default -optKeepFiles Does not remove intermediate .pdb and .inst.* files -optShared Use shared library version of TAU -optCompInst Use compiler-based instrumentation -optPDTInst Use PDT-based instrumentation 28 Selectively Profiling -tau_options=-optTauSelectFile= #Tell tau to not profile these functions # A dynamic phase will break up the profile into phase where BEGIN_EXCLUDE_LIST # each events is recorded according to what void quicksort(int *, int, int) phase of the application # The next line excludes all functions # in which it occured. beginning with "sort_" and having dynamic phase name="foo1_bar" file="foo.c" # arguments "int *" line=26 to line=27 void sort_#(int *) # instrument all the outer loops in this routine void interchange(int *, int *) loops file="loop_test.cpp" routine="multiply" END_EXCLUDE_LIST # tracks memory allocations/deallocations as #Exclude these files from profiling well as potential leaks BEGIN_FILE_EXCLUDE_LIST memory file="foo.f90" routine="INIT" *.so # tracks the size of read, write and print statements in this routine END_FILE_EXCLUDE_LIST BEGIN_INSTRUMENT_SECTION 29 io file="foo.f90" routine="RINB" END_INSTRUMENT_SECTION Environment variables TAU_VERBOSE 决定是否要列出所有计算中间状态(过程)。1为设置该 标志,0为清除该标志。 PROFILEDIR=/dir 指定TAU输出文件文件夹位置dir TAU_TRACK_MESSAGE 跟踪和统计MPI函数消息 TAU_COMM_MATRIX 生成MPI通信矩阵数据 TAU_THROTTLE 判断是否忽略对于一些小函数的分析,这些小函数的调用 次数阈值和时间开销阈值可以用 TAU_THROTTLE_NUMCALLS 和 TAU_THROTTLE_PERCALL(微秒)来控制。对于调用 次数大小TAU_THROTTLE_NUMCALLS,而每次执行时 间却小于TAU_THROTTLE_PERCALL的函数将不予分 析。 TAU_CALLPATH 判断是否需要剖析函数的调用路径。1设置该标志,0清 除该标志。 TAU_CALLPATH_DEPTH 函数调用路径剖析的深度(默认值为2,可大于2) TAU_TRACE 判断是否需要剖析事件并跟踪。1设置该标志,0清除该 30 标志。 Profiling Command line pprof Visualization paraprof --pack YourProfile.ppk paraprof YourProfile.ppk or tau_merge -e events.*.edf -m events.edf tautrace.*.trc tautrace.trc tau2slog2 tautrace.trc events.edf -o app.slog2 jumpshot app.slog2 31 TAU的样子 32 33 34 35 36 37 优化是与应用相关的(VASP NPAR=1) 38 VASP NPAR=2 39 函数调用 40 事件跟踪 41 42 谢 43 谢!