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

📄 systest.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
#include "mpi.h"#include <stdio.h>/* stdlib is needed for declaring malloc */#include <stdlib.h>#define MAX2(a, b) (((a)>(b)) ? (a) : (b))int  GlobalReadInteger();void Hello();void Ring();/*void Stress();void Globals();*/int main(int argc, char *argv[]){	    int me, option, namelen, size;    char processor_name[MPI_MAX_PROCESSOR_NAME];	    MPI_Init(&argc, &argv);    MPI_Comm_rank(MPI_COMM_WORLD,&me);    MPI_Comm_size(MPI_COMM_WORLD,&size);	    if (size < 2) 	{		fprintf(stderr, "systest requires at least 2 processes");		MPI_Abort(MPI_COMM_WORLD, 1);    }	    MPI_Get_processor_name(processor_name,&namelen);	    fprintf(stderr,"Process %d is alive on %s\n", me, processor_name);	fflush(stderr);    while (1) 	{				MPI_Barrier(MPI_COMM_WORLD);		again:		if (me == 0) 		{			/* Read user input for action */			/* (void) printf("\nOptions: 0 = quit, 1 = Hello, 2 = Ring, 3 = Stress, ");			(void) printf("4 = Globals : "); */			(void) printf("\nOptions: 0 = quit, 1 = Hello, 2 = Ring :  ");			(void) fflush(stdout);		}		option = GlobalReadInteger();		if ((option < 0) || (option > 4))			goto again;				switch (option) 		{		case 0:			MPI_Finalize();			return (0);		case 1:			Hello();     break;		case 2:			Ring();      break;			/*			case 3:			Stress();    break;			case 4:			Globals();   break;			*/		default:			fprintf(stderr,"systest: invalid option %d\n", option);			fflush(stderr);			break;		}    }}int GlobalReadInteger()/*Process zero reads an integer from stdin and broadcaststo everyone else*/{    int me, value,  type = 999 , zero = 0;	    MPI_Comm_rank(MPI_COMM_WORLD, &me);    if (me == 0) 	{		if (scanf("%d", &value) != 1)		{			fprintf(stderr,"failed reading integer value from stdin\n");			fflush(stderr);		}    }    MPI_Bcast(&value, 1, MPI_INT, 0, MPI_COMM_WORLD);    return value;}void Hello()/*Everyone exchanges a hello message with everyone else.The hello message just comprises the sending and target nodes.*/{    int nproc, me;    int type = 1;    int buffer[2], node;    MPI_Status status;	    MPI_Comm_rank(MPI_COMM_WORLD, &me);    MPI_Comm_size(MPI_COMM_WORLD, &nproc);	    if (me == 0) 	{		printf("\nHello test ... show network integrity\n----------\n\n");		fflush(stdout);    }	    for (node = 0; node<nproc; node++) 	{		if (node != me) 		{			buffer[0] = me;			buffer[1] = node;			MPI_Send(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD);			MPI_Recv(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD, &status);						if ((buffer[0] != node) || (buffer[1] != me)) 			{				(void) fprintf(stderr, "Hello: %d!=%d or %d!=%d\n",					buffer[0], node, buffer[1], me);				fflush(stderr);				printf("Mismatch on hello process ids; node = %d\n", node);			}						printf("Hello from %d to %d\n", me, node);			fflush(stdout);		}    }}void Ring()       /* Time passing a message round a ring */{    int nproc, me;    MPI_Status status;    int type = 4;    int left, right;    char *buffer;    int lenbuf, max_len;    double us_rate;    double start_ustime, used_ustime;	    MPI_Comm_rank(MPI_COMM_WORLD, &me);    MPI_Comm_size(MPI_COMM_WORLD, &nproc);    left = (me + nproc - 1) % nproc;    right = (me + 1) % nproc;	    /* Find out how big a message to use */	    if (me == 0) 	{		(void) printf("\nRing test...time network performance\n---------\n\n");		(void) printf("Input maximum message size: ");		(void) fflush(stdout);    }    max_len = GlobalReadInteger();    if ((max_len <= 0) || (max_len >= 4*1024*1024))		max_len = 512*1024;    if ((buffer = (char *) malloc((unsigned) max_len)) == (char *) NULL) 	{		printf("process %d could not allocate buffer of size %d\n", me, max_len);		fflush(stdout);		MPI_Abort(MPI_COMM_WORLD, 7777);    }	    lenbuf = 1;    while (lenbuf <= max_len) 	{		start_ustime = MPI_Wtime();		if (me == 0) 		{			MPI_Send(buffer, lenbuf, MPI_CHAR, left, type, MPI_COMM_WORLD);			MPI_Recv(buffer, lenbuf, MPI_CHAR, right, type, MPI_COMM_WORLD,&status);		}		else 		{			MPI_Recv(buffer, lenbuf, MPI_CHAR, right, type, MPI_COMM_WORLD,&status);			MPI_Send(buffer, lenbuf, MPI_CHAR, left, type, MPI_COMM_WORLD);		}		used_ustime = MPI_Wtime() - start_ustime;				if (used_ustime > 0)	/* rate is megabytes per second */			us_rate = (double)(nproc*lenbuf / (used_ustime*(double)1000000));		else			us_rate = 0.0;		if (me == 0) 		{			printf("len=%d bytes, used= %f sec., rate=%f Mbytes/sec\n",				lenbuf, used_ustime, us_rate);			fflush(stdout);		}		lenbuf *= 2;    }    if (me == 0)	{		printf("clock resolution in seconds: %10.8f\n", MPI_Wtick());		fflush(stdout);	}    free(buffer);}

⌨️ 快捷键说明

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