1.1 运行INTEL MPI程序
2. MPIRUN运行方式
mpirun是简化的启动MPI进程方式
单节点简略如:mpirun –np 8 hostname
$ mpirun -machinefile mpd.hosts -np 16 ./program
节点文件mpd.hosts格式如下:
node1:8
node2:8
也可以将node1和node2分别写8行。
1.2 编写MIC程序
MIC程序运行有两种模式:offload模式和native模式(详细可购买参考书《MIC 高性能计算编程指南》 )。offload模式类似于使用GPU作为计算设备的程序,即程序在CPU端启动并运行,中间遇到需要加速计算的部分则转移到MIC上运行,运行结束后再返回CPU端。native模式则是指整个程序从启动到结束都在MIC上运行,与CPU端无关(用户直接登录MIC卡操作系统运行程序)。
服务器所有示例可见[root@node1 public]# ls /public/example/
1.3.1 串行程序
计算PI的串行程序如下:
文件名:pi-serial.c
#include <stdio.h>
#include <math.h>
int main(int argc,char *argv[])
{
int n, i;
double pi, dx, x;
n = 10000;
dx = 1.0 / (double) n;
pi = 0.0;
for(i=0; i<n; i++)
{
x = dx * ((double)i + 0.5);
pi += 4.0*dx/(1.0+x*x);
}
printf("pi is approximately %.16f\n", pi);
return 0;
}
要利用MIC上众多核心的计算资源,首先需要对这个串行程序进行并行化,这里分别采用openmp和mpi两种方法进行并行。
1.3.2 OPENMP并行程序
(1)使用CPU进行计算(加入蓝色粗体部分代码):
文件名:pi-omp.c
#include <stdio.h>
#include <math.h>
int main(int argc,char *argv[])
{
int n, i;
double pi, dx, x;
n = 10000;
dx = 1.0 / (double) n;
pi = 0.0;
#pragma omp parallel for reduction(+:pi)
for(i=0; i<n; i++)
{
x = dx * ((double)i + 0.5);
pi += 4.0*dx/(1.0+x*x);
}
printf("pi is approximately %.16f\n", pi);
return 0;
}
使用icc -openmp -o pi-omp pi-omp.c进行编译,编译得到pi-omp的可执行文件。在HOST端运行即可利用单节点CPU多核资源进行PI的计算。
(2)在MIC上使用native模式进行计算。native模式仍然使用以上pi-omp.c的代码,无需进行任何改动。但需要添加-mmic参数进行编译,如:
icc -mmic -openmp -o pi-omp-native pi-omp.c
将编译得到的可执行程序pi-omp-native拷贝到MIC上的/tmp目录下:
scp pi-omp-native root@mic0:/tmp
再将编译器安装目录下查找libiomp5.so文件,并将其拷贝到MIC卡上的/lib64目录下,如:
cd /public/software/intel/composer_xe_2013/compiler/lib/mic
scp libiomp5.so root@mic0:/lib64
登录到MIC上,进入tmp目录,然后运行刚才拷贝过来的程序。
ssh root@mic0
cd /tmp
./pi-omp-native
这样就可以实现计算PI程序的native运行了。加了-mmic参数编译的程序只能在MIC上运行,无法在CPU上运行。
(3)使用offload模式利用MIC进行计算,代码如下:
文件名:pi-omp-offload.c
#include <stdio.h>
#include <math.h>
int main(int argc,char *argv[])
{
int n, i;
double pi, dx, x;
n = 10000;
dx = 1.0 / (double) n;
pi = 0.0;
#pragma offload target(mic)
#pragma omp parallel for reduction(+:pi)
for(i=0; i<n; i++)
{
x = dx * ((double)i + 0.5);
pi += 4.0*dx/(1.0+x*x);
}
printf("pi is approximately %.16f\n", pi);
return 0;
}
以上代码在pi-omp.c的基础上添加了一行编译制导语句(红色粗体部分):
#pragma offload target(mic)
该编译制导语句提示编译器编译时将仅随其后的代码块同时编译为在MIC上执行的代码和在CPU执行的代码。使用icc -openmp -o pi-omp-offload pi-omp-offload.c对以上程序进行编译,得到的可执行文件为pi-omp-offload,在HOST端直接运行该程序即可使用MIC进行PI的计算了。