现在的位置: 首页 > 综合 > 正文

MPI 处理文件

2013年12月07日 ⁄ 综合 ⁄ 共 2464字 ⁄ 字号 评论关闭

http://www.mcs.anl.gov/research/projects/mpi/usingmpi2/examples/starting/main.htm

下面只是贴了一个基于MPI-1的静态版本的文件的broadcast, 文章中还提供了基于MPI-2的动态版本。

另外还有很全面的MPI的文件处理样式,比如多个node处理同一文件之类的。

master部分的代码

* pcp from SUT, in MPI */ 
#include "mpi.h" 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#define BUFSIZE    256*1024 
#define CMDSIZE    80 
int main( int argc, char *argv[] ) 
{ 
    int mystatus, allstatus, done, numread; 
    char outfilename[128], controlmsg[80]; 
    int infd, outfd; 
    char buf[BUFSIZE]; 
    MPI_Init( &argc, &argv ); 
 
    makehostlist( argv[1], "targets" ); 
    strcpy( outfilename, argv[3] ); 
    if ( (infd = open( argv[2], O_RDONLY ) ) == -1 ) { 
        fprintf( stderr, "input file %s does not exist\n", argv[2] );  
	sprintf( controlmsg, "exit" ); 
	MPI_Bcast( controlmsg, CMDSIZE, MPI_CHAR, 0, MPI_COMM_WORLD ); 
	MPI_Finalize(); 
	return( -1 ); 
    } 
    else { 
        sprintf( controlmsg, "ready" ); 
        MPI_Bcast( controlmsg, CMDSIZE, MPI_CHAR, 0, MPI_COMM_WORLD ); 
    } 
 
    sprintf( controlmsg, outfilename ); 
    MPI_Bcast( controlmsg, CMDSIZE, MPI_CHAR, 0, MPI_COMM_WORLD ); 
    if ( (outfd = open( outfilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU ) ) == -1 )  
        mystatus = -1; 
    else 
        mystatus = 0; 
    MPI_Allreduce( &mystatus, &allstatus, 1, MPI_INT, MPI_MIN, 
		   MPI_COMM_WORLD ); 
    if ( allstatus == -1 ) { 
        fprintf( stderr, "output file %s could not be opened\n", outfilename ); 
	MPI_Finalize(); 
	return( -1 ); 
    } 
 
    /* at this point all files have been successfully opened */ 
     
    done = 0; 
    while ( !done ) { 
        numread = read( infd, buf, BUFSIZE ); 
	MPI_Bcast( &numread, 1, MPI_INT, 0, MPI_COMM_WORLD ); 
	if ( numread > 0 ) { 
	    MPI_Bcast( buf, numread, MPI_BYTE, 0, MPI_COMM_WORLD ); 
	    write( outfd, buf, numread ); 
	} 
	else {	   
	    close( outfd ); 
	    done = 1; 
	} 
    } 
    MPI_Finalize(); 
} 
 
int makehostlist( char spec[80], char filename[80] ) 
{ 
 
} 

slaver部分的代码

/* pcp from the Scalable Unix Tools, in MPI */ 
#include "mpi.h" 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#define BUFSIZE    256*1024 
#define CMDSIZE    80 
int main( int argc, char *argv[] ) 
{ 
    int   mystatus, allstatus, done, numread; 
    char  outfilename[128], controlmsg[80]; 
    int   outfd; 
    char  buf[BUFSIZE]; 
 
    MPI_Init( &argc, &argv ); 
 
    MPI_Bcast( controlmsg, CMDSIZE, MPI_CHAR, 0, MPI_COMM_WORLD ); 
    if ( strcmp( controlmsg, "exit" ) == 0 ) { 
        MPI_Finalize(); 
	return -1; 
    } 
 
    MPI_Bcast( controlmsg, CMDSIZE, MPI_CHAR, 0, MPI_COMM_WORLD ); 
    if ( (outfd = open( controlmsg, O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU ) ) == -1 )  
        mystatus = -1; 
    else 
        mystatus = 0; 
    MPI_Allreduce( &mystatus, &allstatus, 1, MPI_INT, MPI_MIN, 
		   MPI_COMM_WORLD ); 
    if ( allstatus == -1 ) { 
	MPI_Finalize(); 
	return( -1 ); 
    } 
 
    /* at this point all files have been successfully opened */ 
     
    done = 0; 
    while ( !done ) { 
	MPI_Bcast( &numread, 1, MPI_INT, 0, MPI_COMM_WORLD ); 
	if ( numread > 0 ) { 
	    MPI_Bcast( buf, numread, MPI_BYTE, 0, MPI_COMM_WORLD ); 
	    write( outfd, buf, numread );  
	} 
	else {	   
	    close( outfd ); 
	    done = 1; 
	} 
    } 
    MPI_Finalize(); 
} 

抱歉!评论已关闭.