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

    运行结果:

    实例:

  • 相关阅读:
    去掉影响美观的横滚动条
    Visio绘制事件分解图
    Visio绘制系统图
    asp.net与js中字符串的HTML编码与解码
    《ERP从内部集成起步》读书笔记——第一章 Garthner公司是如何提出ERP的 1.1尊重历史
    Asp.net页面传参数给Silverlight
    Gridview中格式化数据的方法
    让silverlight不在最顶层,可以在悬浮层之下
    DateTime类型中 DayOfWeek时的英文如何转换成中文(转)
    Asp.net页面中通过Js控制Silverlight显示值
  • 原文地址:https://www.cnblogs.com/lin1216/p/12899006.html
Copyright © 2020-2023  润新知