您现在的位置是:首页 >其他 >高性能计算MPI并行编程模型实验(MPI Programming Model)网站首页其他
高性能计算MPI并行编程模型实验(MPI Programming Model)
1.Environment setup for MPI programming
(1)检查mingw64的安装,然后下载msmpi,并且检查安装路径
因为我用的是VScode,所以我要配置coderunner插件,在setting.json中配置
修改C和CPP的默认编译语句:
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt -fopenmp -l msmpi -L "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" -I "C:\Program Files (x86)\Microsoft SDKs\MPI\Include" && mpiexec -n 8 $fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt -fopenmp -l msmpi -L "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" -I "C:\Program Files (x86)\Microsoft SDKs\MPI\Include" && mpiexec -n 8 $fileNameWithoutExt",
(这个默认编译语句是八线程,可以根据需要取修改)
使得可以调用安装的MPI的库
同时修改c_cpp_properties.json中的includePath,往里面添加我的MPI库的安装路径"C:/Program Files (x86)/Microsoft SDKs/MPI/Include",于是等会使用的时候就不用写绝对路径来引用MPI库,也不会报错。
(2)华为泰山服务器自带了MPI的运行环境,无须配置可以直接运行
2.MPI Environment
Code:
Run on my PC
Run on HUAWEI TaiShan200 server
Analysis:
这段代码使用了 MPI 库,实现了多进程的并行计算。首先调用 MPI_Init 函数初始化 MPI 环境,然后调用 MPI_Comm_size 和 MPI_Comm_rank 函数分别获取当前进程总数和当前进程的编号。接着,它使用 MPI_Get_processor_name 函数获取当前的管理员用户名称,保存到name,namelength是名称的长度,最后将这些信息打印到控制台。我测试的时候使用了八线程,于是会输出八行,每行对应了一个线程。
3.Blocking Send/Receive
MPI Hello World
Code:
Run on my PC
Run on HUAWEI TaiShan200 server
Analysis:
代码调用了MPI库,演示了两个进程之间的通信。初始定义了一个长度为5的字符串。
程序中有两个进程,进程编号为 2 和 7。MPI_Init 函数初始化 MPI 环境,然后调用 MPI_Comm_rank 函数获取当前进程的编号。如果进程编号为 2,则该进程向进程 7 发送一条消息(字符串 "HELLO"),字符串长度为5,标签是1234,使用 MPI_Send 函数发送。如果进程编号为 7,则该进程使用 MPI_Recv 函数等待来自进程 2 的消息,接收长度为5的字符串以及他的标签,当收到消息时,它会把接收到的字符串打印到控制台。
测试时我们调用八个线程,运行结果表明程序成功调用进程2和7,其中进程 2 向进程 7 发送了一条消息,进程 7 成功接收并打印了消息内容以及发送方进程的编号和标签。
4.Nonblocking send/receive
Code:
Run on my PC
Run on HUAWEI TaiShan200 server
Analysis:
这段代码实现了非阻塞的通信。程序中用到了两个进程,进程编号为 0 和 1。当进程编号为 0 时,该进程使用 MPI_Isend 函数向进程 1 发送一条消息(字符串 "HELLO"),然后程序输出一条消息,包含发送的字符串,表示开始发送,然后返回。接下来,使用 MPI_Wait 函数等待发送操作完成后,输出另一条消息,表示发送操作已经完成。如果进程编号为 1,则该进程使用 MPI_Irecv 函数等待来自进程 0 的消息,收到消息然后程序输出,表示接收操作已经开始。接下来,使用 MPI_Wait 函数等待接收操作完成,输出另一条消息,表示接收操作已经完成,并打印接收到的字符串。
程序在使用 MPI_Isend 和 MPI_Irecv 函数时,需要确保发送和接收操作已经完成,否则可能会出现错误。因此,在本程序中,使用 MPI_Wait 函数等待通信操作完成。
5.Collective communication broadcast/reduce pi estimation in MPI and MPI+OMP
Code:
Run on my PC
Run on HUAWEI TaiShan200 server
Analysis:
这个代码调用MPI 并行计算,其中每个进程负责计算一部分小长方体的面积,然后将计算结果汇总起来以获得最终的圆周率估计值。程序中使用了 MPI_Bcast 函数将微分分数 n 这一个int类型数据,通过进程0广播给所有进程;每个进程分别独立计算部分面积,最后使用 MPI_Reduce 函数对每个进程计算的面积mypi进行求和,进程0得到累加计算出的圆周率估计值 pi,然后用进程 0 输出最终结果。