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;
}

。。。 

posted @ 2024-03-17 12:57  酥炸小黄瓜  阅读(19)  评论(0编辑  收藏  举报