【并行计算】【《并行程序设计导论》笔记】第三章:用MPI进行分布式内存编程


因上努力

个人主页:丷从心·

系列专栏:并行计算

果上随缘


3.1|预备知识

编译与执行
打印来自进程问候语句的MPI程序
#include <stdio.h>
#include <string.h>
#include <mpi.h>

const int MAX_STRING = 100;

int main(void)
{
    char greeting[MAX_STRING];
    int comm_sz;
    int my_rank;

    MPI_Init(NULL, NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    if (my_rank != 0)
    {
        sprintf(greeting, "Greetings from process %d of %d!", my_rank, comm_sz);

        MPI_Send(greeting, strlen(greeting) + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);
    }
    else
    {
        printf("Greetings from process %d of %d!\n", my_rank, comm_sz);

        for (int q = 1; q < comm_sz; q++)
        {
            MPI_Recv(greeting, MAX_STRING, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

            printf("%s\n", greeting);
        }
    }

    MPI_Finalize();

    return 0;
}
编译
mpicc -g -Wall -o mpi_hello mpi_hello.c
执行
mpiexec -n 4 ./mpi_hello
通信子
  • 通信子指的是一组可以互相发送消息的进程集合
  • 通信子称为MPI_COMM_WORLD
SPMD程序
  • S P M D SPMD SPMD是指单程序多数据流
  • 一个单一程序,让不同进程产生不同动作,让进程按照它们的进程号来匹配程序分支
MPI_Send()方法
  • 参数tag是个非负int型,用于区分看上去完全一样的消息,例如tag 0 0 0表示消息用于打印,tag 1 1 1表示消息用于计算
  • 一个通信子中的进程所发送的消息不能被另一个通信子中的进程所接收
status_p参数
  • MPI_Status是一个有至少三个成员MPI_SOURCEMPI_TAGMPI_ERROR的结构
  • 接收到的数据量不是存储在应用程序可以直接访问到的域中,可以通过调用MPI_Get_count函数找回这个值
int MPI_Get_count(MPI_Status* status_p, MPI_Datatype type, int* count_p)
MPI_Send()和MPI_Recv()的语义
  • MPI_Send()典型的实现方法有一个默认的消息截止大小,如果一条消息的大小小于截止大小,它将被缓冲;如果大于截止大小,那么MPI_Send()函数将被阻塞
  • M P I MPI MPI要求消息是不可超越的,即如果 q q q号进程发送了两条消息给 r r r号进程,那么 q q q进程发送的第一条消息必须在第二条消息之前可用
潜在的陷阱
  • 如果一个进程试图接收消息,但没有相匹配的消息,那么该进程将会被永远阻塞在那里,即进程悬挂
  • 如果调用MPI_Send()发生了阻塞,并且没有相匹配的接收,那么发送进程就悬挂;如果调用MPI_Send()被缓冲,但没有相匹配的接收,那么消息将被丢失

  • 14
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值