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

📄 hvectest.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
/*    hvectest - test program that sends an array of floats from the first              process of a group to the last, using send and recv and the	     vector datatype.*/#include <stdio.h>#include "mpi.h"#include "test.h"/* #define SHOWMSG */#ifdef VERBOSEstatic int verbose = 1;#elsestatic int verbose = 0;#endifint main( int argc, char **argv ){    int rank, size, to, from, tag, count, i;    int src, dest;    int st_source, st_tag, st_count;    int errcnt = 0;    MPI_Request handle;    MPI_Status status;    double data[100];    MPI_Datatype rowtype;    MPI_Init( &argc, &argv );    MPI_Comm_rank( MPI_COMM_WORLD, &rank );    MPI_Comm_size( MPI_COMM_WORLD, &size );    src  = size - 1;    dest = 0;/*    dest  = size - 1;    src = 0; */    MPI_Type_vector( 10, 1, 10, MPI_DOUBLE, &rowtype );    MPI_Type_commit( &rowtype );    /* First test: send a row */    if (rank == src) {	to     = dest;	count  = 1;	tag    = 2001;	for (i = 0; i < 100; i++)	    data[i] = i;	/* Send a row */	MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD );#ifdef SHOWMSG	printf("%d sent", rank );	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif    }    if (rank == dest) {	tag   = MPI_ANY_TAG;	count = 10;			from  = MPI_ANY_SOURCE;	MPI_Recv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD,		 &status ); 	st_source = status.MPI_SOURCE;	st_tag    = status.MPI_TAG;	MPI_Get_count( &status, MPI_DOUBLE, &st_count );	if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {	    printf( "Status info: source = %d, tag = %d, count = %d\n",		    st_source, st_tag, st_count );	}#ifdef SHOWMSG	printf( "%d received", rank);	for (i = 0; i < 10; i++) printf(" %f",data[i]);	printf("\n");#endif	for (i = 0; i < 10; i++) if (data[i] != 10*i) { 	    errcnt++;	    fprintf( stderr, 		    "[%d](rcv double) %d'th element = %f, should be %f\n",		     rank, i, data[i], 10.0*i );	    }    }    /* Second test: receive a column into row */    if (rank == src)    {	to     = dest;	count  = 10;	tag    = 2001;	for (i = 0; i < 100; i++)	    data[i] = i;	/* Send a row */	MPI_Send( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD );#ifdef SHOWMSG	printf("%d sent", rank );	for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n");#endif    }    if (rank == dest)    {	tag   = MPI_ANY_TAG;	count = 1;			from  = MPI_ANY_SOURCE;	MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD,		 &status ); 	st_source = status.MPI_SOURCE;	st_tag    = status.MPI_TAG;	MPI_Get_count( &status, MPI_DOUBLE, &st_count );	if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {	    printf( "Status info: source = %d, tag = %d, count = %d\n",	        st_source, st_tag, st_count );	}#ifdef SHOWMSG	printf( "%d received", rank);	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif	for (i = 0; i < 10; i++) if (data[i*10] != i) {	    errcnt++;	    fprintf( stderr, 		    "[%d](rcv row) %d'th element = %f, should be %f\n",		     rank, i, data[i*10], 1.0*i );	    }    }    /* Third test: send AND receive a row */    if (rank == src)    {	to     = dest;	count  = 1;	tag    = 2001;	for (i = 0; i < 100; i++)	    data[i] = i;	/* Send a row */	MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD );#ifdef SHOWMSG	printf("%d sent", rank );	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif    }    if (rank == dest)    {	tag   = MPI_ANY_TAG;	count = 1;			from  = MPI_ANY_SOURCE;	MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD,		 &status ); 	st_source = status.MPI_SOURCE;	st_tag    = status.MPI_TAG;	MPI_Get_count( &status, MPI_DOUBLE, &st_count );	if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {	    printf( "Status info: source = %d, tag = %d, count = %d\n",		    st_source, st_tag, st_count );	}#ifdef SHOWMSG	printf( "%d received", rank);	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif	for (i = 0; i < 10; i++) if (data[i*10] != i*10) {	    errcnt++;	    fprintf( stderr, 		    "[%d](rcv row-row) %d'th element = %f, should be %f\n",		     rank, i, data[i*10], 10.0*i );	    }    }    /* Second Set of Tests: Use Isend and Irecv instead of Send and Recv */    /* First test: send a row */    if (rank == src)    {	to     = dest;	count  = 1;	tag    = 2001;	for (i = 0; i < 100; i++)	    data[i] = i;	/* Send a row */	MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle );	MPI_Wait( &handle, &status );#ifdef SHOWMSG	printf("%d sent", rank );	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif    }    if (rank == dest)    {	tag   = MPI_ANY_TAG;	count = 10;			from  = MPI_ANY_SOURCE;	MPI_Irecv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD,		 &handle ); 	MPI_Wait( &handle, &status );	st_source = status.MPI_SOURCE;	st_tag    = status.MPI_TAG;	MPI_Get_count( &status, MPI_DOUBLE, &st_count );	if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {	    printf( "Status info: source = %d, tag = %d, count = %d\n",		    st_source, st_tag, st_count );	}#ifdef SHOWMSG	printf( "%d received", rank);	for (i = 0; i < 10; i++) printf(" %f",data[i]);	printf("\n");#endif	for (i = 0; i < 10; i++) if (data[i] != 10*i) {	    errcnt++;	    fprintf( stderr, 		    "[%d](ircv double) %d'th element = %f, should be %f\n",		     rank, i, data[i], 10.0*i );	    }    }    /* Second test: receive a column into row */    if (rank == src)    {	to     = dest;	count  = 10;	tag    = 2001;	for (i = 0; i < 100; i++)	    data[i] = i;	/* Send a row */	MPI_Isend( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD, 		   &handle );	MPI_Wait( &handle, &status );#ifdef SHOWMSG	printf("%d sent", rank );	for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n");#endif    }    if (rank == dest)    {	tag   = MPI_ANY_TAG;	count = 1;			from  = MPI_ANY_SOURCE;	MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD,		 &handle ); 	MPI_Wait( &handle, &status );	st_source = status.MPI_SOURCE;	st_tag    = status.MPI_TAG;	MPI_Get_count( &status, MPI_DOUBLE, &st_count );	if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {	    printf( "Status info: source = %d, tag = %d, count = %d\n",		    st_source, st_tag, st_count );	}#ifdef SHOWMSG	printf( "%d received", rank);	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif	for (i = 0; i < 10; i++) if (data[i*10] != i) {	    errcnt++;	    fprintf( stderr, 		    "[%d](ircv row) %d'th element = %f, should be %f\n",		     rank, i, data[i*10], 1.0*i );	    }    }    /* Third test: send AND receive a row */    if (rank == src)    {	to     = dest;	count  = 1;	tag    = 2001;	for (i = 0; i < 100; i++)	    data[i] = i;	/* Send a row */	MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle );	MPI_Wait( &handle, &status );#ifdef SHOWMSG	printf("%d sent", rank );	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif    }    if (rank == dest)    {	tag   = MPI_ANY_TAG;	count = 1;			from  = MPI_ANY_SOURCE;	MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD,		 &handle ); 	MPI_Wait( &handle, &status );	st_source = status.MPI_SOURCE;	st_tag    = status.MPI_TAG;	MPI_Get_count( &status, MPI_DOUBLE, &st_count );	if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {	    printf( "Status info: source = %d, tag = %d, count = %d\n",		    st_source, st_tag, st_count );	}#ifdef SHOWMSG	printf( "%d received", rank);	for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");#endif	for (i = 0; i < 10; i++) if (data[i*10] != i*10) {	    errcnt++;	    fprintf( stderr, 		    "[%d](ircv row-row) %d'th element = %f, should be %f\n",		     rank, i, data[i*10], 10.0*i );	    }    }    i = errcnt;    MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );    if (errcnt > 0) {	printf( "Found %d errors in the run \n", errcnt );	}    MPI_Type_free( &rowtype );    Test_Waitforall( );    MPI_Finalize();    return 0;}

⌨️ 快捷键说明

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