在英特尔® 至强融核™ 协处理器上运行 MiniFE*

概述

本案例研究展示了将桑迪亚国家实验室* Mantevo* 项目的 MiniFE 应用移植到英特尔至强融核协处理器上的便捷性。

简介

桑迪亚国家实验室的 Mantevo 项目是多迷你应用程序的集合,旨在模拟广泛使用的高性能计算 (HPC) 算法的核心功能。通过迷你应用程序 HPCCG 及其衍生应用来实现对隐式有限元法的模拟,其中包括一个名为 MiniFE 的迷你应用,它在 1,500 行 C++ 代码中集成了隐式有限元法应用最重要的性能特点。

在本案例中,我们分享了将 MiniFE 的 MPI 并行实施移植到英特尔至强融核协处理器上的经验。

MiniFE 应用较小,可以实验各种平行和矢量化方案,省去了带有超过一百万行代码的典型有限元应用的复杂性。MiniFE 中心的迭代解算器具备大型模拟器建模流体和结构动力学常见的性能特点。MiniFE 可作为这些大规模应用的代表。

MiniFE 是自包含的独立代码。它执行完整的有限元生成、装配和解析。物理域是由六面体单元(有时也称为砖形单元)模拟的三维盒子。该盒子离散为结构化网格,但被视为非结构化网格。使用递归对分法 (RCB) 分解域以支持并行执行。

通过分解域以支持分布式内存执行,MiniFE 提供了部署面向Linux* 操作系统的英特尔® MPI 库的机会,后者支持在英特尔至强融核协处理器和主机系统上执行 MPI 任务。

分析

MiniFE 的主要计算内核是未经过预处理的共轭梯度迭代解算器。共轭梯度算法包括稀疏矩阵向量积,以及点积运算和矢量更新。其中大部分时间用于稀疏矩阵向量积,其性能一般受可用内存带宽的限制。

MiniFE 核心的稀疏矩阵向量积可用做英特尔® 数学核心库 (Intel® MKL) 子例程调用,这样便产生了一个问题,“英特尔 MKL 例程能够提高 MiniFE 稀疏矩阵向量积的性能吗?”

英特尔 MKL 是一种高度优化的数学函数库,特别适合于计算密集型科学、工程和金融应用。其核心数学函数,如BLAS、LAPACK、稀疏矩阵解算器和快速傅里叶变换已面向英特尔至强融核协处理器进行了广泛线程化和优化。开发人员可以通过将他们的应用链接至英特尔 MKL 来充分利用英特尔至强融核协处理器。

如图1所示,面向称为压缩稀疏行 (CSR) 的紧凑型矩阵存储格式的稀疏矩阵向量积是一种双重嵌套循环运算。

查看源输出?

1

for (int row = 0; row < n; row++) { 

2

      double sum = 0.0; 

 

3

      for (int i = Arowoffsets[row]; i < Arowoffsets[row+1]; i++) { 

4

            sum += Acoefs[i] * x[Acols[i]]; 

 

5

      } 

6

      y[row] = sum; 

 

7

}

图 1。稀疏矩阵向量积, y=Ax

上述工作的目标是超过基于英特尔® 至强® E5-2670 处理器的双插槽服务器上的稀疏矩阵向量积性能。

实施

实施中使用预生产的 1.091 GHz 61 核英特尔® 至强融核™ 协处理器、5.5 GT/秒的 8 GB GDDR5-2750 RAM、µOS 2.6.34.11-g4af9302 版本 、闪存 2.1.01.0372 版本以及软件栈 2.1.3653-8 版本,并启用纠错码(ECC)内存模式。主机系统包含双八核英特尔® 至强® E5-26702.6 GHz处理器、32 GB DDR3-1600 RAM、8.0 GT/秒的QPI 以及 Linux * 操作系统2.6.32-220.el6.x86_64 版本 。对于这两个系统而言,我们都使用英特尔® C++ Composer XE 2013.0.079 版本进行编译。

这些命令面向基于英特尔至强处理器和英特尔至强融核协处理器的服务器构建 MiniFE:

mpiicc -restrict -farray-notation -O3 -ansi-alias -fno-alias –xAVX –o miniFE.x

mpiicc -restrict -farray-notation -O3 -ansi-alias -fno-alias -mmic –o miniFE.x.mic

-mmic 选项指示英特尔 C++ Composer XE 进行交叉编译,以在英特尔至强融核协处理器上进行本机执行。

我们使用以下命令在基于英特尔至强处理器和英特尔至强融核协处理器的服务器上启动 MiniFE:

mpiexec -n 16 ./miniFE.x nx=200 ny=200 nz=200

mpiexec –host mic0 -n 60 -wdir /tmp ./miniFE.x.mic nx=200 ny=200 nz=200

在第二次测试中,我们构建一个 MPI 与 OpenMP* 混合 MiniFE,通过线程化来实现稀疏矩阵矢量积的外层循环的并行运算,如图 2 所示。

查看源输出?

1

#pragma omp parallel for firstprivate(n)

2

for (int row = 0; row < n; row++) {

 

3

      double sum = 0.0;

4

      for (int i = Arowoffsets[row]; i < Arowoffsets[row+1]; i++) {

 

5

            sum += Acoefs[i] * x[Acols[i]];

6

      }

 

7

      y[row] = sum;

8

}

图 2。 稀疏矩阵矢量积,外层循环 OpenMP 并行运算

添加 –openmp 至编译命令,来启用 OpenMP 指令。

mpiicc -restrict -farray-notation -O3 -ansi-alias -fno-alias –openmp –xAVX –o miniFE.x

mpiicc -restrict -farray-notation -O3 -ansi-alias -fno-alias –openmp –mmic –o miniFE.x.mic

我们在基于英特尔至强处理器和英特尔至强融核处理器的服务器上借助这些命令来执行 MPI-OpenMP 混合 MiniFE。

mpiexec -n 16 –env OMP_NUM_THREADS=1 ./miniFE.x nx=200 ny=200 nz=200

mpiexec –host mic0 -n 60 –env I_MPI_PIN_DOMAIN=omp –env OMP_NUM_THREADS=4
-wdir /tmp ./miniFE.x.mic nx=200 ny=200 nz=200

最后,我们用英特尔 MKL 例程 CSRGEMV (CSR 格式通用矩阵向量积)来代替双重嵌套循环(图 3)。有关 CSRGEMV 的详细介绍请参见英特尔 MKL 参考手册。

查看源输出?

1

#include <mkl_spblas.h>

2

mkl_cspblas_dcsrgemv ( “N”, &n, Acoefs, Arowoffsets, Acols, x, y );

图 3。英特尔 MKL 稀疏矩阵向量积

当链接至 –mkl=parallel 选项时,英特尔 MKL 子例程是 OpenMP并行运算。

mpiicc -restrict -farray-notation -O3 -ansi-alias -fno-alias –xAVX –openmp –mkl=parallel –o miniFE.x

mpiicc -restrict -farray-notation -O3 -ansi-alias -fno-alias -mmic –openmp –mkl=parallel –o miniFE.x.mic

使用与 MPI-OpenMP 混合版本相同的命令来执行该版本的 MiniFE。

MiniFE 报告在共轭梯度解算器中花费的时间以及在解算器中求解稀疏矩阵向量积的时间。如表 1 和表 2,在两个平台上比较三种版本的 MiniFE,我们可以看出稀疏矩阵向量积确实占用了大部分的求解时间。

 

MiniFE* 双精度

两个英特尔® 至强® E5-2600 处理器

预生产的英特尔® 至强融核™ 协处理器

MPI 原始型

1.80 秒

4.13 秒

MPI-OpenMP* 混合型

1.80 秒

1.90 秒

MPI-Intel® MKL 混合型

1.80 秒

1.29 秒

表 1。稀疏矩阵向量积时间

 

MiniFE* 双精度

两个英特尔® 至强® E5-2600 处理器

预生产的英特尔® 至强融核™ 协处理器

MPI 原始型

2.31 秒

4.60 秒

MPI-OpenMP* 混合型

2.31 秒

2.34 秒

MPI-Intel® MKL 混合型

2.31 秒

1.77 秒

表 2。共轭梯度迭代解算器时间

借助英特尔 MKL 稀疏矩阵向量积,英特尔至强融核协处理器的性能超过了配备两个英特尔至强处理器的服务器。英特尔 MKL 稀疏矩阵向量积能够提升英特尔至强融核协处理器的性能,是因为它使用软件预取和内联函数专门针对英特尔至强融核协处理器进行了优化。内联函数是对英特尔C ++ Compiler XEAPI 的 API 扩展,以轻松实施 SIMD 指令。

将英特尔至强处理器和英特尔至强融核协处理器作为异构集群来使用,可以更快速地执行 MiniFE 模拟。以下 MPI 命令同时在主机处理器和协处理器上执行 MiniFE。

mpiexec –host localhost -n 16 –env OMP_NUM_THREADS=1 ./miniFE.x nx=200 ny=200
nz=200 : -host mic0 -n 20 –env I_MPI_PIN_DOMAIN=omp –env OMP_NUM_THREADS=12
-wdir /tmp ./miniFE.x.mic

表 3 展示了异构系统的性能。

MiniFE* 双精度

两个英特尔® 至强® E5-2600 处理器

预生产的英特尔® 至强融核™ 协处理器

MPI-Intel® MKL 混合型

2.31 秒

1.77 秒

MPI-Intel® MKL 混合型

1.17 秒

表 3。共轭梯度迭代解算器时间

通过将预生产的英特尔至强融核协处理器添加到基于英特尔至强处理器的服务器中,迭代求解器性能提高了一倍。

结论

MPI 应用程序 MiniFE 可以轻松移植到英特尔至强融核协处理器上。对英特尔至强处理器和英特尔至强融核协处理器而言,构建和运行 MiniFE 的命令几乎是一样的。

通过增加 OpenMP 指令来提高 MiniFE 的并行处理能力,使预生产英特尔至强融核协处理器的性能与两个英特尔至强处理器的性能相持平。用英特尔 MKL 例程代替稀疏矩阵矢量积,可以提高协处理器的运行速度。鉴于英特尔 MKL 在不断更新以在新架构上实现出色的性能,英特尔 MKL 子例程也提供了一条轻松的提升道路。

对于MPI并行应用程序而言,英特尔 MPI 库可以通过添加英特尔至强融核协处理器来提升性能。面向协处理器轻松实现现有代码的重新编译。熟悉的 MPI 命令可以在主机和协处理器上启动MPI进程。

其它资源

英特尔® 数学核心库 (Intel® MKL) 参考手册, 文件编号:630813-052US

面向 Linux* 操作系统的英特尔® MPI 库参考手册, 文件编号:315399-011

英特尔® C++ Compiler XE 13.0 用户和参考指南,文件编号:323273-130US

桑迪亚国家实验室* Mantevo* 项目 https://software.sandia.gov/mantevo/

致谢

作者衷心感谢英特尔 MKL 团队,特别是 Sergey Pudov。

作者介绍

Gregg Skinner 是软件与服务事业部 (SSG) 英特尔开发商关系部门的一名应用工程师。

Michael A. Heroux 是可缩放算法部桑迪亚国家实验室的一名杰出研究员。

有关编译器优化的更完整信息,请参阅优化通知