linux 进程阻塞 语句,MPI进程拓扑及非阻塞通信程序示例

题目如下,是关于MPI进程拓扑的:

请编写具有二维拓扑的MPI程序,每个程序都与其上下左右进程进行通信,请打印出它的上下左右进程的进程号和通信的内容。

代码如下,通信语句使用了非阻塞通信方式:

#include"mpi.h"

#include

#defineNUM_DIMS 2

intmain( int argc, char **argv ){

int rank,size;

int periods[NUM_DIMS] = {0,0};

int dims[NUM_DIMS] = {0,0};

int right_nbr, left_nbr;

int *data,buf=0;

int i,flag;

MPI_Comm my_comm;

MPI_Status status;

MPI_Request request;

MPI_Init(&argc, &argv);

MPI_Comm_rank( MPI_COMM_WORLD, &rank );

MPI_Comm_size(MPI_COMM_WORLD, &size);

MPI_Dims_create(size, NUM_DIMS, dims);

MPI_Cart_create(MPI_COMM_WORLD, NUM_DIMS, dims, periods, 0, &my_comm);

data = (int *)malloc( size * sizeof(int) );

//初始化data数组

for(i=0;i

data[i] = 10*i;

}

flag = NUM_DIMS;

while(--flag>=0){

//flag = 1时,横向,flag = 0时,纵向

MPI_Cart_shift(my_comm, flag, 1, &left_nbr, &right_nbr);

MPI_Isend(&data[rank], 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

MPI_Isend(&data[rank], 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

if(flag){

printf("进程[%d]发送数据数据(%d)\n",rank, data[rank]);

}

if(left_nbr!=-1){

MPI_Irecv(&buf, 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

printf("进程[%d]从%s进程[%d]接收到数据(%d)\n",rank, flag?"左边":"上边", left_nbr, buf);

}

if(right_nbr!=-1){

MPI_Irecv(&buf, 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

printf("进程[%d]从%s进程[%d]接收到数据(%d)\n",rank, flag?"右边":"下边", right_nbr, buf);

}

}

MPI_Finalize();

}

进程数为8时,程序运行结果如下:

0eb5f18cc0ce9c4b41218a40be760587.bmp0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的MPI程序示例,用于在进程之间发送消息: ```c #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { int rank, size, tag = 0; char message[100]; MPI_Status status; // 初始化MPI环境 MPI_Init(&argc, &argv); // 获取进程的排名 MPI_Comm_rank(MPI_COMM_WORLD, &rank); // 获取进程数量 MPI_Comm_size(MPI_COMM_WORLD, &size); if (rank == 0) { // 如果进程是0号进程,则发送消息给1号进程 sprintf(message, "Hello, process 1! This is process 0."); MPI_Send(message, strlen(message) + 1, MPI_CHAR, 1, tag, MPI_COMM_WORLD); } else if (rank == 1) { // 如果进程是1号进程,则接收从0号进程发送的消息 MPI_Recv(message, 100, MPI_CHAR, 0, tag, MPI_COMM_WORLD, &status); printf("Process 1 received message: %s\n", message); } // 终止MPI环境 MPI_Finalize(); return 0; } ``` 这个程序中,进程0发送了一条消息给进程1,进程1接收到了这条消息并打印出来。MPI_Send和MPI_Recv函数是用于发送和接收消息的,它们有一些参数需要注意: - 发送方使用MPI_Send函数来发送消息,参数包括消息内容、消息长度、接收方进程的排名、消息的标签(用于区分不同类型的消息)以及通信域(可以是MPI_COMM_WORLD,表示所有进程之间的通信)。 - 接收方使用MPI_Recv函数来接收消息,参数包括消息缓冲区、消息缓冲区的长度、发送方进程的排名、消息的标签、通信域以及一个MPI_Status结构体,用于存储接收到的消息的一些元数据,如消息的长度、发送方的排名等。 在使用MPI编程时,需要注意的一个重要问题是消息传递的顺序。MPI_Send和MPI_Recv函数都是阻塞调用,也就是说当一个进程调用MPI_Send函数发送消息时,该函数不会立即返回,直到接收方进程调用MPI_Recv函数接收到该消息为止。因此,在编写MPI程序时,需要保证消息的发送和接收的顺序是正确的,否则可能会出现死锁等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值