为了将来在英特尔® 至强™ 处理器和英特尔® 至强融核™ 协处理器(代号 Knights Landing)上实现部分应用就绪,开发人员主要希望从两个方面改进工作负载:
- 矢量化/代码生成
- 线程并行性
本文主要讨论矢量化/代码生成,并介绍了一些有用的线程并行工具和资源。
1) 矢量化
- 英特尔® 高级矢量扩展指令集 512 (英特尔® AVX-512)首先在处理器和协处理器上部署,而且未来可以在 Knights Landing 之后推出的英特尔至强处理器上使用。
关于英特尔 AVX-512 的更多详情,请参阅: https://software.intel.com/en-us/blogs/2013/avx-512-instructions - 英特尔 AVX-512 可显著改进基于当前英特尔® 至强融核™ 协处理器(代号 Knights Corner)的英特尔® 初始众核指令(英特尔® IMCI)。
- 今天的英特尔® 编译器 (14.0+) 能够针对 Knights Landing 编译代码,您可以在英特尔® 软件开发仿真器 (英特尔® SDE)上运行二进制。 英特尔® 编译器作为英特尔® Parallel Studio XE 的组件提供(点击此处进行使用和购买),产品文档可以点击此处进行获取
- 英特尔 SDE 是针对即将推出的指令集架构 (ISA) 扩展指令集的仿真器。 它支持您运行程序,在目前没有使用新指令的硬件上使用这些新指令。
- 英特尔 SDE 对于性能分析、编译器开发调试和数据库应用开发非常有帮助。
- 面向 Sandy Bridge、Ivy Bridge、Haswell、Broadwell、Skylake (Client)、Goldmont 和 Knights Landing (KNL)的英特尔 SDE 可以通过以下链接获取: http://www.intel.com/software/sde
- 请注意,英特尔 SDE 是一款软件仿真器,主要用于对未来指令的仿真。 其周期精确,速度可能非常慢(最高 100 倍)。 该仿真器的性能不精确。
- 指令混合:
- 英特尔 SED 随附了多种有用的支持仿真器的针脚工具,其中一种是混合直方图工具。
- 该混合直方图工具可以从以下任何一个方面来计算直方图:运行的动态指令、指令长度、指令类型和 ISA 扩展指令集分组。
- mix-mt 工具还可显示前 N 个最常运行的基本数据块并将其反汇编。
- 指令混合可报告多种信息:
- 与指令相关的最大的几种基本数据块的百分比、评估编译器代码生成的动态指令执行情况、基于函数的指令数故障、每种 ISA 的指令数等。
- 借助适当的参数脚本,您还可评估 FLOP 数量、INT 数量、内存操作数、SIMD 强度(操作/指令)等。
针对 Knights Landing 编译应用
使用最新的英特尔编译器 (14.0+) 并使用 “-xMIC-AVX512”编译器手柄进行编译,以生成 Knights Landing (KNL) 二进制。
如要在英特尔 SDE 上运行应用
sde –knl -- ./<knl.exe> <args.>
或者您可以按照以下方式运行 MPI 应用
mpirun –n <no. of ranks> sde –knl -- ./<knl.exe> <args.>
如要使用英特尔 SDE 为不同的架构生成“指令混合”报告:
英特尔至强融核协处理器
Knights Landing
sde –knl -mix -top_blocks 100 -iform 1 -- ./<knl.exe> <args.>
您还可在英特尔 SDE 上运行相应的英特尔至强处理器二进制,以便进行比较和分析:
英特尔至强处理器
Ivy Bridge
sde -ivb -mix -top_blocks 100 -iform 1 -- ./<ivb.exe> <args.>
Haswell
sde –hsw -mix -top_blocks 100 -iform 1 -- ./<hsw.exe> <args.>
建议使用单 MPI/OpenMP* 线程 (OMP_NUM_THREADS=1) 生成指令混合报告,以便简化分析。
如要解决线程并行性问题,请参阅以下线程并行性部分。
使用英特尔 SDE 中的指令混合报告的示例分析
从 http://www.berkeleygw.org/提取内核
减少的动态指令总数:
- Intel AVX -> Intel AVX2 减少数量: 1.08 倍
- Intel AVX2 -> Intel AVX-512 减少数量: 3.15 倍数
函数级别的故障
进一步的故障(isa-set 类别)
采用该内核的英特尔 AVX 和英特尔 AVX2 的 x87 代码的重要百分比
基本块
英特尔 SDE 还可为基于热指令执行的运行提供最大的基本块。
对于最重要的基本块,您会在该内核中发现面向英特尔 AVX/AVX2 代码的内核中存在大量 x87 指令。 下图仅展示了英特尔 AVX2 指令混合报告最大基本块的片段。
上述基本块的相应源代码是第 459 行(如上图突出显示的部分)。
查看我们观察到的源,在该语句中第 459 行的划分“较为复杂”,编译器生成 x87 序列,以遵守严格的 IEEE 语义,避免出现“溢出”和“下溢”的情况。
避免出现这种情况的方法是使用 -fp-model fast=2 进行编译。 这让编译器认为双精度分母的实数部分和虚数部分位于近似范围,因此它不使用上述的方法即可生成简单代码。 然后,他可以为整个循环生成矢量英特尔 AVX/AVX2 指数。
基本块中的 EXECUTIONS 数量是该基本块运行的时间,ICOUNT 可以提供针对该基本块的全部运行的指令总数。 因此,ICOUNT/EXECUTIONS 可以提供该基本块中的指令的总数。
此外,将编译器生成的矢量优化报告(使用 –qopt-report=5)和 SDE 最大基本块相结合可用于第一次优化“矢量化研究”。 使用 –qopt-report=5 进行编译可以生成优化报告文件 kernel.optrpt。 您可以在基本块中查找相应的源代码行(示例:上图的第 459 行),并将其映射到编译器生成的优化报告中,以查找您的循环/基本块是否进行了矢量化处理(如果没有,是因为什么原因)。 在优化报告中,您还可以看到诸如循环中的一些阵列是否对齐等消息。
这只是能够在英特尔 SDE 指令混合报告中使用的分析类型,但是还有许多分析无法在其中使用。 关于更多详细信息,请参阅 https://software.intel.com/en-us/articles/intel-software-development-emulator
针对运行的配置: 提取出的内核的指令混合使用英特尔® SDE 7.2 版生成,应用使用英特尔® 编译器 14.0.2 20140120 版编译。 运行由英特尔 Engineer Karthik Raman 执行。 如欲了解更多信息,请访问:http://www.intel.com/performance
2) 线程并行性
有效并行性是 HPC 域中的应用实现出色性能和集群扩展的关键。 随着众核架构(如英特尔至强融核协处理器)使用以及英特尔至强处理器上的核心数量越来越多,这更加至关重要。
并行性可以跨越多个层,如指令层(超标量)、数据层(SIMD/矢量)、线程层:共享内存 (OpenMP) 和/或分布式内存 (MPI)。 许多 HPC 程序迁移至混合共享内存/分布式内存编程模型,其中使用了 OpenMP 和 MPI 两种方式。
您可以使用现有的硬件(英特尔至强处理器和/或英特尔至强融核协处理器 (Knights Corner))来测试应用的线程可扩展性和效率。
许多工具可以用于线程可扩展性分析, 以下列出了其中的几种:
- 使用 Intel® VTune™ Amplifier XE 2015
对 OpenMP 的可扩展性进行分析 串行与并行时间之比较、运转支出、可能获得的提升等 - 英特尔® 跟踪分析器和跟踪采集器
了解 MPI 应用的行为,快速查找瓶颈,并使并行集群应用实现高性能。 - 英特尔® Inspector XE 2015
内存和线程错误调试和线程相关性分析。