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

📄 flood2.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
#include "mpi.h"#include <stdio.h>#include <stdlib.h>#include "test.h"#define MAX_REQ 32#define MAX_MSG_CNT 32000#define MAX_MSG 2048/*    This program tests a flood of data of short messages to test handling   of both incoming messages and internal message queues */void SetupData ( int *, int, int );void SetupRdata ( int *, int );int  CheckData ( int *, int, int, MPI_Status * );#ifdef VERBOSEstatic int verbose = 1;#elsestatic int verbose = 0;#endifint main( int argc, char **argv ){    MPI_Comm comm;    MPI_Request r[MAX_REQ];    MPI_Status  s[MAX_REQ];    int msgsize, maxmsg, root, i, j, size, rank, err = 0, msgcnt, toterr;    int *sbuf, *rbuf;    MPI_Init( &argc, &argv );        comm = MPI_COMM_WORLD;    MPI_Comm_size( comm, &size );    MPI_Comm_rank( comm, &rank );    if (size < 2) {	printf( "This test requires at least 2 processors\n" );	MPI_Abort( comm, 1 );    }    /* First, try large blocking sends to root */    root = 0;        maxmsg =  MAX_MSG;    msgsize = 128;    msgcnt  = MAX_MSG_CNT;    if (rank == root && verbose) printf( "Blocking sends: " );    while (msgsize <= maxmsg) {	if (rank == root) {	    if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }	    rbuf = (int *)malloc( msgsize * sizeof(int) );	    if (!rbuf) {		printf( "Could not allocate %d words\n", msgsize );		MPI_Abort( comm, 1 );	    }	    for (i=0; i<size; i++) {		if (i == rank) continue;		for (j=0; j<msgcnt; j++) {		    SetupRdata( rbuf, msgsize );		    MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );		    err += CheckData( rbuf, msgsize, 2*i, s );		}	    }	    free( rbuf );	}	else {	    sbuf = (int *)malloc( msgsize * sizeof(int) );	    if (!sbuf) {		printf( "Could not allocate %d words\n", msgsize );		MPI_Abort( comm, 1 );	    }	    SetupData( sbuf, msgsize, 2*rank );	    for (j=0; j<msgcnt; j++) 		MPI_Send( sbuf, msgsize, MPI_INT, root, 2*rank, comm );	    free( sbuf );	}	msgsize *= 4;    }    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }    /* Next, try unexpected messages with Isends */    msgsize = 128;    maxmsg  = MAX_MSG;    msgcnt  = MAX_REQ;    if (rank == root && verbose) printf( "Unexpected recvs: " );    while (msgsize <= maxmsg) {	if (rank == root) {	    if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }	    rbuf = (int *)malloc( msgsize * sizeof(int) );	    if (!rbuf) {		printf( "Could not allocate %d words\n", msgsize );		MPI_Abort( comm, 1 );	    }	    MPI_Barrier( comm );	    for (i=0; i<size; i++) {		if (i == rank) continue;		for (j=0; j<msgcnt; j++) {		    SetupRdata( rbuf, msgsize );		    MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );		    err += CheckData( rbuf, msgsize, 2*i, s );		}	    }	    free( rbuf );	}	else {	    sbuf = (int *)malloc( msgsize * sizeof(int) );	    if (!sbuf) {		printf( "Could not allocate %d words\n", msgsize );		MPI_Abort( comm, 1 );	    }	    SetupData( sbuf, msgsize, 2*rank );	    for (j=0; j<msgcnt; j++) {		MPI_Isend( sbuf, msgsize, MPI_INT, root, 2*rank, comm, &r[j] );	    }	    MPI_Barrier( comm );	    MPI_Waitall( msgcnt, r, s );	    free( sbuf );	}	msgsize *= 4;    }    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }    /* Try large synchronous blocking sends to root */    root = 0;        msgsize = 128;    maxmsg  = MAX_MSG;    if (rank == root && verbose) printf( "Synchronous sends: " );    while (msgsize <= maxmsg) {	if (rank == root) {	    if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }	    rbuf = (int *)malloc( msgsize * sizeof(int) );	    if (!rbuf) {		printf( "Could not allocate %d words\n", msgsize );		MPI_Abort( comm, 1 );	    }	    for (i=0; i<size; i++) {		if (i == rank) continue;		for (j=0; j<msgcnt; j++) {		    SetupRdata( rbuf, msgsize );		    MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );		    err += CheckData( rbuf, msgsize, 2*i, s );		}	    }	    free( rbuf );	}	else {	    sbuf = (int *)malloc( msgsize * sizeof(int) );	    if (!sbuf) {		printf( "Could not allocate %d words\n", msgsize );		MPI_Abort( comm, 1 );	    }	    SetupData( sbuf, msgsize, 2*rank );	    for (j=0; j<msgcnt; j++) 		MPI_Ssend( sbuf, msgsize, MPI_INT, root, 2*rank, comm );	    free( sbuf );	}	msgsize *= 4;    }    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );        if (rank == 0) {	if (toterr == 0) printf( " No Errors\n" );	else printf( "!! found %d errors\n", toterr );    }    if (toterr) {	printf( "!! found %d errors on processor %d\n", err, rank );    }    MPI_Finalize( );    return 0;}void SetupData( sbuf, n, tag )int *sbuf, n, tag;{    int i;    for (i=0; i<n; i++) 	sbuf[i] = i;}int CheckData( rbuf, n, tag, s )int *rbuf, n, tag;MPI_Status *s;{    int act_n, i;    MPI_Get_count( s, MPI_INT, &act_n );    if (act_n != n) {	printf( "Received %d instead of %d ints\n", act_n, n );	return 1;    }    for (i=0; i<n; i++) {	if (rbuf[i] != i) {	    printf( "rbuf[%d] is %d, should be %d\n", i, rbuf[i], i );	    return 1;	}    }    return 0;}void SetupRdata( rbuf, n )int *rbuf, n;{    int i;        for (i=0; i<n; i++) rbuf[i] = -(i+1);}

⌨️ 快捷键说明

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