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

📄 managerworker.c

📁 简单的并行计算示例
💻 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 + -