高性能计算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 输出最终结果。

猜你喜欢

转载自blog.csdn.net/lijj0304/article/details/130462197