📄 managerworker.c
字号:
#include "mpi.h"#include <stdio.h>#define SIZE 500#define MIN(x,y) ((x) < (y) ? x : y)void manager_code (int numprocs) ;void worker_code(void) ;int main(int argc,char *argv[]){ int numprocs,myrank ; int namelen ; char processor_name[MPI_MAX_PROCESSOR_NAME] ; char greeting[MPI_MAX_PROCESSOR_NAME+80] ; MPI_Init( &argc , &argv ) ; MPI_Comm_size( MPI_COMM_WORLD, &numprocs ) ; MPI_Comm_rank( MPI_COMM_WORLD, &myrank ) ; MPI_Get_processor_name(processor_name,&namelen) ; sprintf(greeting,"process %d of %d on %s",myrank,numprocs,processor_name) ; if( myrank == 0 ) { manager_code( numprocs ) ; } else worker_code() ; MPI_Finalize() ; return 0 ;}void manager_code (int numprocs){ double a[SIZE][SIZE],c[SIZE]; int i,j,sender,row,numsent =0; double dotp; MPI_Status status; for (i=0; i<SIZE ;i++) for(j=0; j<SIZE; j++) a[i][j]=(double) j; for (i=1;i<MIN(numprocs ,SIZE);i++) { MPI_Send(a[i-1],SIZE,MPI_DOUBLE, i, i,MPI_COMM_WORLD); printf("Manager give a work to worker &d\n", i ) ; numsent++; } for (i=0;i<SIZE;i++) { MPI_Recv(&dotp,1,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG, MPI_COMM_WORLD,&status); sender=status.MPI_SOURCE; row=status.MPI_TAG -1; c[row]=dotp; if (numsent<SIZE) { printf("worker %d has finished one work!\n", sender) ; printf("Manager give work %d to him\n" ,numsent) ; MPI_Send(a[numsent],SIZE,MPI_DOUBLE,sender,numsent+1,MPI_COMM_WORLD); numsent++; } else { printf("worker %d's work is done!\n", sender) ; MPI_Send(MPI_BOTTOM,0,MPI_DOUBLE,sender,0,MPI_COMM_WORLD); } }}void worker_code(void){ double b[SIZE], c[SIZE] ; int i ,row , myrank ; double dotp ; MPI_Status status ; for( i = 0 ; i < SIZE; i ++ ) b[i] = 1.0 ; MPI_Comm_rank( MPI_COMM_WORLD, &myrank ) ; if( myrank <= SIZE ) { MPI_Recv( c, SIZE, MPI_DOUBLE,0,MPI_ANY_TAG, MPI_COMM_WORLD, &status ) ; while( status.MPI_TAG > 0 ) { row = status.MPI_TAG -1 ; dotp = 0.0 ; for ( i = 0 ; i < SIZE ; i++ ) dotp += c[i] * b[i] ; MPI_Send(&dotp, 1, MPI_DOUBLE, 0, row + 1, MPI_COMM_WORLD ) ; MPI_Recv(c , SIZE, MPI_DOUBLE, 0, MPI_ANY_TAG, MPI_COMM_WORLD,&status ) ; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -