MPI(一)- 快速入门
六大基础函数
MPI_Init
int MPI_Init(int *argc, char ***argv)
初始化 MPI 环境MPI_Finalize
int MPI_Finalize(void)
结束MPI环境MPI_Comm_rank
int MPI_Comm_rank(MPI_Comm comm, int *rank)
获取当前进程的标识。MPI_Comm
是通信域,表示一组进程之间的通信空间;rank
是一个指向整数的指针,用于存储当前进程标识号。MPI_Comm_size
int MPI_Comm_size(MPI_Comm comm, int *size)
获取通信域的进程总数。MPI_Send
int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
将一个进程的数据发送给另一个进程。
buf
:指向发送数据缓冲区的指针count
:要发送的数据数量datatype
:发送数据的类型dest
:接收数据的进程标识号tag
:消息的标签,用于在接收时过滤消息。发送和接收需要tag一致,用于区分同一目的地的不同消息comm
:通信域
MPI_Recv
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)
接收另一个进程发送的数据。
buf
:指向接收数据缓冲区的指针count
:要接收的数据数量datatype
:接收数据的类型source
:指定发送数据的进程标识,如果为MPI_ANY_SOURCE
则表示可以接收来自任何进程的消息tag
:指定消息的标签,用于在发送时过滤消息comm
:通信域status
:用于存储接收状态信息的结构体指针,如果不需要接收状态信息,可以将其设为MPI_STATUS_IGNORE
。-
int MPI_SOURCE
-
int MPI_TAG
-
int MPI_ERROR
-
简单应用-----积分法求π
#include "mpi.h"
#include <iostream>
using namespace std;
double func(double x){
return 4.0 / (1.0 + x * x);
}
int main(int argc, char* argv[]) {
int id, num_procs;
int name_len;
int n = 1000; // 划分1000份
double l = 1.0 / n; // 每份的长度
double sum = 0;
double x = 0;
double pi = 0;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &id);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Get_processor_name(processor_name, &name_len);
cerr << "Process " << id << " of " << num_procs << " on " << processor_name << endl;
for (int i = id * 200, j = 0; j < 200; i++, j++) { // 5个进程
x = l * ((double )i - 0.5);
sum = sum + func(x);
}
MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (id == 0){
cout << "PI = " << pi * l << endl;
}
MPI_Finalize();
return 0;
}
。。。