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

📄 testconnectserial.c

📁 fortran并行计算包
💻 C
字号:
#include <mpi.h>#include <pthread.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>#include "connectstuff.h"int main( int argc, char ** argv ) {    MPI_Comm tmp, comm, startComm;    char * fname;    char * actualFname = NULL;    char * globalFname = NULL;    int totalSize, expectedRank, size, cachedRank;    char portName[MPI_MAX_PORT_NAME];    int rankToAccept = 1;    /* Debug - print out where we picked up the MPICH build from */    msg( "MPICH library taken from: %s\n", MPICHLIBSTR );    if( argc != 4 ) {        printf( "Usage: %s <fname> <totalSize> <idx-1-based>\n", argv[0] );        exit( 1 );    }    /* This is the base name of the file into which we write the port */    fname = argv[1];    /* This is the total number of processes launched */    totalSize = atoi( argv[2] );    /* Each process knows its expected rank */    expectedRank = atoi( argv[3] )-1;    /* Start a watchdog thread which will abort after 120 seconds, and will     * print stack traces using GDB every 5 seconds if you don't call     * strokeWatchdog() */    startWatchdog( 120 );    /* Print a debug header */    msg( "Waiting for: %d - my rank is %d\n", totalSize, expectedRank );    /* Singleton init */    MPI_Init( 0, 0 );    /* Duplicate from MPI_COMM_SELF the starting point */    MPI_Comm_dup( MPI_COMM_SELF, &startComm );        if( expectedRank == 0 ) {        /* This process opens the port, and writes the information to the file */        MPI_Open_port( MPI_INFO_NULL, portName );                /* Write the port to fname.<rank> so that the connecting processes can         * wait their turn by checking for the correct file to show up */        actualFname = writePortToFile( portName, "%s.%d", fname, rankToAccept++ );        /* The wrapper script I'm using checks for the existance of "fname", so         * create that - even though it isn't used  */        globalFname = writePortToFile( portName, fname );        installExitHandler( globalFname );        comm = startComm;    } else {        char * readPort;        readPort = getPortFromFile( "%s.%d", fname, expectedRank );        strncpy( portName, readPort, MPI_MAX_PORT_NAME );        free( readPort );        msg( "Read port <%s>\n", portName );                MPI_Comm_connect( portName, MPI_INFO_NULL, 0, startComm, &comm );        MPI_Intercomm_merge( comm, 1, &tmp );        comm = tmp;        MPI_Comm_size( comm, &size );        msg( "After my first merge, size is now: %d\n", size );    }    while( size < totalSize ) {        /* Make sure we don't print a stack until we stall */        strokeWatchdog();        /* Accept the connection */        MPI_Comm_accept( portName, MPI_INFO_NULL, 0, comm, &tmp );        /* Merge into intracomm */        MPI_Intercomm_merge( tmp, 0, &comm );        /* Free the intercomm */        MPI_Comm_free( &tmp );        /* See where we're up to */        MPI_Comm_rank( comm, &cachedRank );        MPI_Comm_size( comm, &size );        if( expectedRank == 0 ) {            msg( "Up to size: %d\n", size );            /* Delete the old file, create the new one */            unlink( actualFname );            free( actualFname );            /* Allow the next rank to connect */            actualFname = writePortToFile( portName, "%s.%d", fname, rankToAccept++ );        }    }    MPI_Comm_rank( comm, &cachedRank );    msg( "All done - I got rank: %d.\n", cachedRank );    MPI_Barrier( comm );    if( expectedRank == 0 ) {        /* Cleanup on rank zero - delete some files */        sleep( 4 );        unlink( actualFname );        free( actualFname );        unlink( globalFname );        free( globalFname );        /* This lets my wrapper script know that we did everything correctly */        indicateConnectSucceeded();    }    MPI_Finalize();}

⌨️ 快捷键说明

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