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

📄 waitall.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
/* * This code tests waitall; in particular, the that ordering requirement * on nonblocking communication is observed. */#include <stdio.h>#include "mpi.h"#if defined(NEEDS_STDLIB_PROTOTYPES)#include "protofix.h"#endif#ifdef HAVE_UNISTD_H/* For sleep */#include <unistd.h>#endif#define MAX_REQ 32#ifndef HAVE_SLEEPvoid sleep( int secs ){#ifdef VX_WORKS    /* Also needs include <time.h>? */    struct timespec rqtp = { 10, 0 };    nanosleep(&rqtp, NULL);#else    double t;    t = MPI_Wtime();    while (MPI_Wtime() - t < (double)secs) ;#endif}#endifint main( int argc, char **argv ){    int rank, size;    int i, j, count, err = 0, toterr;    MPI_Request r[MAX_REQ];    MPI_Status  s[MAX_REQ];    int         buf[MAX_REQ][MAX_REQ];    MPI_Init( &argc, &argv );    MPI_Comm_rank( MPI_COMM_WORLD, &rank );    MPI_Comm_size( MPI_COMM_WORLD, &size );    if (size < 2) {	fprintf( stderr, "This test requires at least 2 processes\n" );	MPI_Abort( MPI_COMM_WORLD, 1 );    }    /* First, cause the wait all to happen AFTER the Sends */    if (rank == 0) {	for (i=0; i<MAX_REQ; i++) {	    MPI_Irecv( buf[i], i+1, MPI_INT, 1, 99, MPI_COMM_WORLD, 		       &r[MAX_REQ-1-i] ); 	}	MPI_Waitall( MAX_REQ, r, s );	/* Check that we've received the correct data */	for (i=0; i<MAX_REQ; i++) {	    MPI_Get_count( &s[MAX_REQ-1-i], MPI_INT, &count );	    if (count != i) {		err++;		fprintf( stderr, "Wrong count (%d) for request %d\n", 			 count, MAX_REQ-1-i );	    }	}    }    else if (rank == 1) {	for (i=0; i<MAX_REQ; i++) {	    for (j=0; j<=i; j++)		buf[i][j] = i * MAX_REQ + j;	    MPI_Send( buf[i], i, MPI_INT, 0, 99, MPI_COMM_WORLD );	}    }    /* Second, cause the waitall to start BEFORE the Sends */    if (rank == 0) {	for (i=0; i<MAX_REQ; i++) {	    MPI_Irecv( buf[i], i+1, MPI_INT, 1, 99, MPI_COMM_WORLD, 		       &r[MAX_REQ-1-i] ); 	}	MPI_Send( MPI_BOTTOM, 0, MPI_INT, 1, 0, MPI_COMM_WORLD );	MPI_Waitall( MAX_REQ, r, s );	/* Check that we've received the correct data */	for (i=0; i<MAX_REQ; i++) {	    MPI_Get_count( &s[MAX_REQ-1-i], MPI_INT, &count );	    if (count != i) {		err++;		fprintf( stderr, 			 "Wrong count (%d) for request %d (waitall posted)\n", 			 count, MAX_REQ-1-i );	    }	}    }    else if (rank == 1) {	MPI_Recv( MPI_BOTTOM, 0, MPI_INT, 0, 0, MPI_COMM_WORLD, &s[0] );	sleep( 2 );	for (i=0; i<MAX_REQ; i++) {	    for (j=0; j<=i; j++)		buf[i][j] = i * MAX_REQ + j;	    MPI_Send( buf[i], i, MPI_INT, 0, 99, MPI_COMM_WORLD );	}    }    MPI_Barrier( MPI_COMM_WORLD );    if (rank == 0) {	toterr = err;	if (toterr == 0) 	    printf( "Test complete\n" );	else	    printf( "Found %d errors in test!\n", toterr );    }        MPI_Finalize();    return 0;}

⌨️ 快捷键说明

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