《并行程序设计导论》 mpi编写hello

在消息传递程序中,运行在一个核-内存上的程序 通常称为一个进程。两个进程可以通过调用函数来进行通信。我们将使用消息传递的实现称为消息传递接口(Message-Passing Interface,MPI)。它是一个函数库

#include<mpi.h>

用$开头的,我是用的linux的终端写的,
其余的都是普通的.c文件内容

记录一下我的操作过程(在linux中建立c文件)
1.建议一个文件夹用来存放程序
2.进入文件夹,右键点击打开终端
3.新建一个c文件,按i进入编辑模式
vim new.c
4.写完内容后,按esc键后,输入 :wq
5.然后就写完一个c文件了

编译(成为可执行文件exe格式)

$mpicc -g -Wall -o mpi_hello mpi_hello.c -std=c99

执行(用4个进程运行程序)

$mpiexec -n 4 ./mpi_hello

程序3-1 打印来自进程问候语的mpi程序

/*
1.通信子communicator是一组可以互相发送消息的进程集合
2.在并行编程中将进程按照非负整数编号是十分常见的

*/

#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);//让comm_sz获得进程数
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);//让my_rank获得当前的进程号
//以上的固定流程

if(my_rank!=0)
{
sprintf(greeting,"Greetings from process %d of %d!",my_rank,comm_sz);
//生成要发送给0号进程的消息
MPI_Send(greeting,strlen(greeting)+1,MPI_CHAR,0,0,MPI_COMM_WORLD);
//将消息发送给0号进程
}
else
{
printf("Greetings from process %d of %d!",my_rank,comm_sz);
//指派0号进程为输出进程,其余进程向他发送消息
for(int q=1;q<comm_sz;q++)
{
MPI_Recv(greeting,max_string,MPI_CHAR,q,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
printf("%s\n",greeting);
}
}
//以下是固定流程
MPI_Finalize();
return 0;
}




MPI_Init(NULL,NULL);是用来告诉mpi系统进行必要的初始化设置
它的语法结构是

int MPI_Init(int* argc_p,char*** argv_p);

MPI_Finalize();是为了告知MPI系统MPI已经使用完毕
它的语法结构是

int MPI_Finalize(void);

MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);//让comm_sz获得进程数 MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);//让my_rank获得当前的进程号
他们的语法结构是

int MPI_Comm_size(
  MPI_Comm comm,//通信子
  int* comm_sz_p);//进程数
   
int MPI_Comm_rank(
   MPI_Comm comm,//通信子
   int* my_rank_p);//进程号


MPI_Send(greeting,strlen(greeting)+1,MPI_CHAR,0,0,MPI_COMM_WORLD);将除了0号进程外其他进程的消息发送给0号进程
他的语法结构是

int MPI_Send(
void* msg_buf_p,//指向包含消息内容的内存块的指针
int msg_size,//消息的大小,字符串还要加一个空指针的位置
MPI_Datatype msg_type,//消息的类型
int dest,//指定要接受消息的进程的进程号
int tag,//用于区分看起来完全一样的消息
MPI_Comm communicator);//通信子

MPI_Recv(greeting,max_string,MPI_CHAR,q,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); 接收q号进程发来的消息
注意,这里的max_string和strlen(greeting)+1,内存大小和消息大小
他的语法结构是

int MPI_Recv(
//前三个数制定了用于接收消息的内存
void* msg_buf_p,//指向内存块
int buf_size,//指定内存块中要存储对象的数量
MPI_Datatype buf_type,//说明对象的类型
//后三个数用来识别消息
int source,//指定了消息应该从哪个进程发送而来
int tag,//要与发送消息的参数tag相匹配
MPI_Comm communicator,//必须与发送进程所用的通信子相匹配
MPI_Status* status_p);//在大多数情况下调用函数并不使用这个参数
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值