MPI 处理文件

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(); 
} 




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值