MPI学习四-集合通信

Posted lin1216

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MPI学习四-集合通信相关的知识,希望对你有一定的参考价值。

1.集合通信

技术图片

 

 

 技术图片

 

 

 (1)广播:是一对多通信的典型例子,调用格式如下:

           MPI_Bcast(Address,Count,Datatype,Root,Comm)

          技术图片

 

 

 

 1 #include <stdio.h>
 2 #include <mpi.h>
 3 
 4 int main(int argc,char **argv)
 5 {
 6     int rank;
 7     int ibuf;
 8     
 9     MPI_Init(&argc,&argv);
10     MPI_Comm_rank(MPI_COMM_WORLD,&rank);
11     
12     if(rank == 0)
13       ibuf = 12345;
14     else
15       ibuf = 0;
16 
17     MPI_Bcast(&ibuf,1,MPI_INT,0,MPI_COMM_WORLD);
18 
19     if(rank != 0)
20     {
21       printf("my rank = %d ibuf = %d
",rank,ibuf);
22     }
23     MPI_Finalize();
24 
25     return 0;
26 }

运行结果:

技术图片

 

 

 (2)广播

技术图片

 

 

 技术图片技术图片

 

 技术图片

 

 实例:

 1 #include <stdio.h>
 2 #include <mpi.h>
 3 int main(int argc,char **argv)
 4 {
 5     int i;
 6     int rank,nproc;
 7     int isend,irecv[32];
 8     MPI_Comm comm = MPI_COMM_WORLD;
 9     MPI_Init(&argc,&argv);
10     MPI_Comm_size(comm,&nproc);
11     MPI_Comm_rank(comm,&rank);
12 
13     isend = rank + 1;
14     MPI_Gather(&isend,1,MPI_INT,irecv,1,MPI_INT,0,comm);
15 
16     if(rank == 0)
17     {
18       for( i=0; i<nproc; i++)
19       {
20         printf("irecv = %d 
",irecv[i]);
21       }
22     }
23 
24     MPI_Finalize();
25 
26 
27     return 0;
28 }

运行结果:

技术图片

 

 (3)散播

技术图片

 

 技术图片技术图片

 

 实例:

 1 #include "stdio.h"  
 2 #include "mpi.h"  
 3 #include "stdlib.h"  
 4 #define N 10
 5 int main(int argc, char **argv)
 6 {
 7     int size, rank;
 8     int* send;
 9     int *recv;
10     int i = 0;
11 
12     MPI_Init(&argc, &argv);
13     MPI_Comm_size(MPI_COMM_WORLD, &size);
14     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
15 
16 
17     send = (int *)malloc(size*N*sizeof(int));
18     recv = (int *)malloc(N*sizeof(int));
19 
20     if (rank == 0)
21     {
22         for (; i < size*N; i++) {
23             send[i] = i;
24         }
25     }
26 
27     MPI_Scatter(send, N, MPI_INT,recv, N, MPI_INT, 0, MPI_COMM_WORLD);
28 
29     
30     printf("------------------------------------------------
rank=%d
", rank);
31     for (i = 0; i < N; i++)
32     {
33         printf("recv_buffer[%d] = %d
", i, recv[i]);
34      }  
35     printf("------------------------------------------------
");
36 
37     MPI_Finalize();  
38     return 0;  
39 }  

运行结果:

技术图片

 

 

 

 

 

实例:

 

以上是关于MPI学习四-集合通信的主要内容,如果未能解决你的问题,请参考以下文章

MPI+OpenACC编程中的GPU间通信

MPI学习3MPI并行程序设计模式:不同通信模式MPI并行程序的设计

多核机器上 MPI 集合操作的实现细节

非阻塞 MPI 和会合协议

MPI数据通信常用函数

MPI数据通信常用函数