⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icpi.c

📁 MPICH2+VC6.0 并行计算程序
💻 C
字号:
//A(4,4)*B(4,1)=C(4,1)
//如果单机执行,进程数为4
//如果机群执行,并行机个数为4 

#include   <stdio.h> 
#include   <mpi.h> 
#define    SIZE   4 
int   main(int   argc,   char   **argv)   { 
      int   j; 
      int   rank,   size,   root; 
      float   X[SIZE]; 
      float   X1[SIZE]; 
      float   Y1[SIZE]; 
      float   Y[SIZE][SIZE]; 
      float   Z[SIZE]; 
      float   z; 
      root   =   0; 
      MPI_Init(&argc,   &argv); 
	  MPI_Comm_size(MPI_COMM_WORLD,   &size);
      MPI_Comm_rank(MPI_COMM_WORLD,   &rank); 
	  
	  printf("%d %d %d\n",SIZE,size,rank);

      if   (rank==root)   
	  { 
            Y[0][0]   =   1;   Y[1][0]   =   2;   Y[2][0]   =   3;   Y[3][0]   =   4; 
            Y[0][1]   =   5;   Y[1][1]   =   6;   Y[2][1]   =   7;   Y[3][1]   =   8; 
            Y[0][2]   =   9;   Y[1][2]   =   10;  Y[2][2]   =   11;  Y[3][2]   =   12; 
            Y[0][3]   =   13;  Y[1][3]   =   14;  Y[2][3]   =   15;  Y[3][3]   =   16; 
            Z[0]   =   1; 
            Z[1]   =   2; 
            Z[2]   =   3; 
            Z[3]   =   4; 
      } 
      MPI_Barrier(MPI_COMM_WORLD); //聚合通信_障碍同步,调用该函数时进程处于等待状态
	                               //直到通信器中所有的进程都调用该函数是才继续执行.
      
      MPI_Scatter(Y,SIZE,MPI_FLOAT,Y1,SIZE,MPI_FLOAT,root,MPI_COMM_WORLD); 
	                               //聚合通信_数据散发,它将一个进程中的数据按块散发给通信器中的所有进程
	                               //依次散发,本题中散发情况为:
	                               //Y[0][0]->0,Y[0][1]->1,Y[0][2]->2,Y[0][3]->3
	                               //Y[1][0]->0,Y[1][1]->1,Y[1][2]->2,Y[1][3]->3
	                               //Y[2][0]->0,Y[2][1]->1,Y[2][2]->2,Y[2][3]->3
	                               //Y[3][0]->0,Y[3][1]->1,Y[3][2]->2,Y[3][3]->3

      MPI_Scatter(Z,1,MPI_FLOAT,&z,1,MPI_FLOAT,   root,MPI_COMM_WORLD); 
	                               //分别将Z[0],Z[1],Z[2],Z[3],散发给进程0,1,2,3
 
            for(j=0;j <SIZE;j++)
			{ 
            X1[j]   =   z*Y1[j];  
			} 
     
      MPI_Reduce(X1,X,SIZE,MPI_FLOAT,MPI_SUM,root,MPI_COMM_WORLD); 
	                               //聚合通信_归约,求和
      if   (rank==0)  
	  { 
          printf("%g %g %g %g %g\n",Y1[0],Y1[1],Y1[2],Y1[3],z); //进程0分配的各数据,Y1[SIZE],z
          printf( "%g\n",X[0]);printf( "%g\n",X[1]);printf( "%g\n",X[2]);printf( "%g\n",X[3]); 
      } 
      MPI_Finalize(); 
          return   0; 
} 
 
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -