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的計算了。