Who are you?

MIC-HelloWorld

从这部分内容开始,我将对MIC高性能计算进行一个比较系统的学习,周期大致为2017年上半年,努力争取完成这个小目标。

这篇内容主要是对MIC(Many Intergrated Cores)做一个简单介绍,并利用中国科大超算中心(SCC)ChinaGrid服务器上的MIC计算节点进行简单测试,在此感谢SCC提供的技术与服务支持!

MIC高性能计算简介

现状简介

目前主流的集群架构系统:

  • CPU同构架构系统;
  • CPU+GPU异构架构系统:以CPU为主体,主要运行逻辑计算部分,而GPU进行密集运算,两者属于不同指令集下的异构;
  • CPU+MIC异构架构系统:基于x86架构的异构计算,MIC的基本指令集与CPU一样,采用x86指令集,并有部分扩展。

计算机体系结构分类(根据指令与数据流,Flynn分类法)

  • 单指令流单数据流计算机(SISD)——批处理机模型
  • 单指令流多数据流计算机(SIMD)
  • 多指令流单数据流计算机(MISD)——少见
  • 多指令流多数据流计算机(MIMD)

在商用并行计算机中,MIMD模型最为通用,SIMD次之。

目前高性能计算技术(并行计算的硬件)

  • 对称多处理机(Symmetric MultiProcessing,SMP):一种多处理机硬件架构,有两个或更多的相同的处理机(处理器)共享同一主存,由一个操作系统控制。对称多处理架构将多核处理器中的核作为不同的处理器。在进行并行编程时,通常使用线程的任务划分,使用OpenMP扩展或是pThread线程库
  • 集群(Cluster):通常指一组计算机(一般为服务器级别的硬件)通过网络松散集成,组成局域网,并紧密合作完成计算任务的结构。由于并非共享内存结构,因此通常采用消息传递方式,如MPI,进行进程级的并行。

松散集成:是相对于在电路板上或是通过高速总线相连接来说的,一般集群中的计算机结点可以单独使用。

紧密合作:指节点间通常相互协作完成同一任务,而非各自为政。

  • 通用图形处理器(GPGPU,General-purpose computing on graphics processing units):是一种利用处理图形任务的图形处理器来计算原本由中央处理器处理的通用计算任务。这些通用计算常常与图形处理没有任何关系。

统一设备计算架构(Compute Unified Device Architecture,CUDA):将GPU作为数据并行计算设备的软硬件系统。

开放计算语言(Open Computing Language,OpenCL),开放图形库(OpenGL),OpenAL

MIC(Many Integrated Core)

什么是MIC

MIC指的是基于集成众核架构的至强融核系列。其是将多个核心整合在一起的处理器,面向HPC领域,旨在引领行业进入百亿亿次计算的时代,其在计算机体系中,并非要取代CPU,而是作为协处理器存在。MIC芯片通常有数十个精简的x86核心,提供高度并行的计算能力。另外,与其他协处理器不同的是,原生CPU程序(支持C/C++以及Fortran)也可以在MIC上运行,对现有程序无须大的改动。MIC采用SMP结构,以一致性共享缓存为中心。

一些名词:

  • MIC:架构名称;
  • Knights系列:研发代号
  • Intel Xeon Phi:产品线名称

GPGPU与MIC比较

  • CUDA与MIC中“核”的概念不同,但由于有超线程,MIC中的“执行核”数与GPGPU实际差不多;
  • MIC采用SMP结构,以一致性共享缓存为中心,使MIC可以使用传统CPU的编程模型;
  • MIC编程与工具方面没有较大的改动;
  • GPGPU适用于并行程度极高,分支较少的应用,而MIC适用于并行程度较高,逻辑(分支以及循环等指令)比较复杂的应用。

MIC编程

MIC编程模型

  • 应用程序编程:利用开发工具开发用户应用程序或代码;
  • 系统编程:使用低级API的编程(SCIF),低级API的内容包含在MPSS(Intel MIC Platform Software stack)中。

MIC应用模式

简单分为三种(依据串行与并行之间的权重)

CPU为中心模式:
  1. CPU原生模式(native模式)

    • 采用纯CPU计算:适于串行或并行程度较低的并行程序;
    • 编译选项:-no-offload
  2. CPU为主MIC为辅模式(offload模式)

    • 以CPU为中心,MIC协同计算:适于串行计算程序中包含高度并行计算的部分。 程序主函数由CPU发起,执行到并行部分交由MIC计算;
    • 此时可以将CPU端称为主机端,或host端,而将MIC端称为设备端,或device端;
    • 编程形式类似于OpenMP,通过编译制导语句标示欲并行计算的代码。通常,offload语句会与OpenMP语句相结合,以使用MIC设备并行化执行。
    • 这种模式类似于GPGPU:串行执行—并行部分—串行执行。

关于offload:

  • offload相关的语义:

    • 指offload代码,又称为offload语句
    • 指使用offload语句编程、运行的模式,即offload模式
    • 指将代码段运行于协处理器上的动作
  • offload模式的适用情况

    • 常用于单节点,且/或已被OpenMP改造过的程序;
    • 支持单机单MIC卡和单机多MIC卡,但不支持使用offload语句控制多节点。若是多节点并行,需在外围框架中使用MPI进行数据传输,内部则使用offload+OpenMP模式;
    • 欲改造现有串行程序使用offload模式并行,则需要:
      • ①确定欲并行的部分,并将其改写成OpenMP并行程序;
      • ②确定输入输出变量之后,书写相应的offload语句。
MIC为中心模式
  • MIC原生模式
    • 采用纯MIC计算:适于高并行计算程序,直接在MIC运行。如部分划给CPU执行,反而会增加通信等额外开销。
    • MIC拥有自己的基于Linux的操作系统,且拥有自己的IP地址。支持卡上运行模式,将程序与数据传输到MIC卡上,并直接在MIC卡上运行程序。
  • MIC为主CPU为辅模式
    • 以MIC为中心,CPU协同计算:适于高并行计算程序中包含部分串行计算部分,程序主函数有MIC发起,执行到串行部分交由CPU,在此CPU作为协处理器。

Tips:

  1. 卡上原生运行MIC程序的模式适用于:

    • 程序整体算法是并行的;
    • 传输、同步开销过大的程序
  2. 原生模式运行事项:

    • 编译选项:-mmic;
    • 如此编译的程序只能在MIC端运行而不能在CPU端运行,因此在使用时需用编译两份代码
CPU与MIC对等模式
  • 对等模式
    • 适于多进程并行程序,如MPI程序,程序主函数在CPU与MIC端同时发起。
    • 在这种模式下,与跨节点并行相同,都需要使用MPI函数接口进行通信。
    • 不需要offload语句进行标示,全部程序的副本在MIC端运行。

CPU与MIC的工作分配

  • 当MIC与CPU协同工作时,CPU负责进行逻辑性强的事务处理与串行计算,MIC负责并行计算部分。他们各自拥有独立的存储器地址空间:主机端内存和设备端内存。主机端与设备端的数据交换通过API函数或是编译器指令实现。
  • MIC程序与传统的CPU程序相比,增加的只有指示将代码在设备端运行以及相应的数据传输语句而已
  • MIC采用的是MIMD架构,既支持SIMD并行方式,也可以通过pThread、MPI等方式是现在不同计算核心上运行不同的指令。

MIC原生程序示例—计算Pi

程序源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* mic_pi.c */
#include<stdio.h>
#incllude<stdlib.h>
#include<math.h>
int main()
{
float pi=0.0f;
int count = 1000;
int i;
// #pragma offload target(mic)
//以MIC原生模式运行,不需要offload语句
#pragma omp parallel for reduction(+:pi)
for(i=0;i<count;i++)
{
float t=(float)((i+0.5f)/count);
pi+=4.0f/(1.0f+t*t);
}
pi/=count;
printf("Pi=%f\n",pi);
}

编译指令

1
#icc mic_pi.c -openmp -mmic -o mic_pi

-mmic表示以原生模式运行,编译后的文件无法在CPU端运行。从左到右依次为:编译器,输入文件,编译选项*3,输出文件

运行指令

1
./mic_pi

参考资料: