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

📄 cancelmessages.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
/* * This file tests to see if short,eager,and rndv messages can all be  * successfully cancelled.  If they cannot be cancelled, then the  * program still must successfully complete. */#include "mpi.h"#include <stdio.h>#if defined(NEEDS_STDLIB_PROTOTYPES)#include "protofix.h"#endifint main( int argc, char *argv[] ){    double       sbuf[20000];#ifdef FOO    double rbuf[20000];#endif    int          rank;    int          n, flag, size;    int          err = 0;    int          verbose = 0;    MPI_Status   status;    MPI_Request  req;    MPI_Init( &argc, &argv );    MPI_Comm_rank( MPI_COMM_WORLD, &rank );    MPI_Comm_size( MPI_COMM_WORLD, &size );    if (size < 2) {	printf( "Cancel test requires at least 2 processes\n" );	MPI_Abort( MPI_COMM_WORLD, 1 );    }    /* Short Message Test */    n = 200;    if (rank == 1) { /* begin if rank = 1 */	MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );	MPI_Cancel(&req); 	MPI_Wait(&req, &status);	MPI_Test_cancelled(&status, &flag);	if (!flag) {	    err++;	    printf( "Cancelling a short message failed where it should succeed.\n" );	}	else if (verbose)	{	    printf("Cancelling a short message succeeded.\n");	}    }  /* end if rank == 1 */#ifdef FOO/* Note that MPI-2 specifies that status.MPI_ERROR is only set by   multiple completion (e.g., MPI_Waitsome) and not by test_cancelled.*/    MPI_Barrier(MPI_COMM_WORLD);     if (rank == 0) {  /* begin if rank == 0 */	MPI_Recv( rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &status);    }  /* end if rank = 0 */    else if (rank == 1) { /* begin if rank = 1 */	MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );	MPI_Cancel(&req); 	MPI_Wait(&req, &status);	MPI_Test_cancelled(&status, &flag);	if (!flag && status.MPI_ERROR != MPI_SUCCESS) {	    err++;	    printf( "Cancel of a send returned an error in the status field.\n" );	}	  /* end if status.MPI_ERROR */    }  /* end if rank == 1 */#endif    MPI_Barrier(MPI_COMM_WORLD);    /* Eager Message Test */    n = 3000;    if (rank == 1) { /* begin if rank = 1 */	MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );	MPI_Cancel(&req);	MPI_Wait(&req, &status);	MPI_Test_cancelled(&status, &flag);	if (!flag) {	    err++;	    printf( "Cancelling an eager message (3000 doubles) failed where it should succeed.\n" );	}	else if (verbose)	{	    printf("Cancelling an eager message (3000 doubles) succeeded.\n");	}    }  /* end if rank == 1 */#ifdef FOO    MPI_Barrier(MPI_COMM_WORLD);     if (rank == 0) {  /* begin if rank == 0 */	MPI_Irecv(rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &req );	MPI_Wait( &req, &status);    }  /* end if rank = 0 */    else if (rank == 1) { /* begin if rank = 1 */	MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );	MPI_Cancel(&req);	MPI_Wait(&req, &status);	MPI_Test_cancelled(&status, &flag);	if (!flag && status.MPI_ERROR != MPI_SUCCESS) {	    err++;	    printf( "Cancel of a send returned an error in the status field.\n" );	}	/* end if status.MPI_ERROR */    }  /* end if rank == 1 */#endif    MPI_Barrier(MPI_COMM_WORLD);    /* Rndv Message Test */    n = 20000;    if (rank == 1) { /* begin if rank = 1 */	MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );	MPI_Cancel(&req);	MPI_Wait(&req, &status);	MPI_Test_cancelled(&status, &flag);	if (!flag) {	    err++;	    printf( "Cancelling a rendezvous message failed (20000 doubles) where it should succeed.\n" );	}	else if (verbose)	{	    printf("Cancelling an rendezvous message (20000 doubles) succeeded.\n");	}    }  /* end if rank == 1 */#ifdef FOO    MPI_Barrier(MPI_COMM_WORLD);     if (rank == 0) {  /* begin if rank == 0 */	MPI_Irecv(rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &req );	MPI_Wait( &req, &status);     }  /* end if rank = 0 */    else if (rank == 1) { /* begin if rank = 1 */	MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );	MPI_Cancel(&req);	MPI_Wait(&req, &status);	MPI_Test_cancelled(&status, &flag);	if (!flag && status.MPI_ERROR != MPI_SUCCESS) {	    err++;	    printf( "Cancel of a send returned an error in the status field.\n" );	}	/* end if status.MPI_ERROR */    }  /* end if rank == 1 */#endif    MPI_Barrier(MPI_COMM_WORLD);     if (rank == 1) {  /* begin if rank = 1 */	if (err) {	    printf( "Test failed with %d errors.\n", err );	}	else {	    printf( " No Errors\n" );	}    }    MPI_Finalize( );    return 0;}

⌨️ 快捷键说明

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