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

📄 sendtyped2.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
#include "p4.h"#define FINAL_BARRIER 5#define PassVars( inf, outf, TYPE, TYPE_P4NAME, FORMAT, msg ) { \  TYPE x; \  int from, tag, len, count; \ \  count = 0; \  if (inf) { \    while (fread( &x, sizeof( TYPE ), 1, inf )) { \      p4_sendx( 4, 1, &x, sizeof( TYPE ), TYPE_P4NAME ); \      fprintf( outf, FORMAT, x ); \      count++; \      /* fprintf( stderr, "Sent %d.\n", count ); */ \    } \    p4_send( 4, 1, &x, 0 ); \      /* send 0-length terminator message */ \    fprintf( stderr, "0 sent %d somethings.\n", count ); \    rewind( inf ); \ \  } else { \    while (from = 0, \	   tag = 4, \	   p4_recv( &tag, &from, &msg, &len ), \	   len) { \      fprintf( outf, FORMAT, *((TYPE *)msg) ); \      count++; \    } \    fprintf( stderr, "Received %d somethings.\n", count ); \  } \}main( argc, argv )int argc;char **argv;{  p4_initenv( &argc, argv );  if (!p4_get_my_id()) p4_create_procgroup();  slave( argc, argv );  p4_dprintf("Waiting for end.\n");  p4_global_barrier(FINAL_BARRIER); /* broadcasts may be in progress */  p4_dprintf("All done.\n");  p4_wait_for_end();}slave( argc, argv )int argc;char **argv;{  int myid, np;  int from, tag, len;  char *msg;  int i, j, k;  FILE *inf, *outf;  myid = p4_get_my_id();  np = p4_num_total_ids();  msg = p4_msg_alloc(2000);      if (!myid) {    if (argc!=4) {      printf( "three arguments required: input file, output file 1, \output file 2\n\n" );      p4_send( 1, 1, "", 1 );      return 1;    } else {      p4_send( 1, 1, argv[3], strlen( argv[3] )+1 );    }    tag = 2; from = 1;    p4_recv( &tag, &from, &msg, &len );    if (!*((FILE **)msg)) {      printf( "Could not open %s (%d).  Exiting.\n\n", argv[3],	      (int)*((FILE **)msg) );      return 1;    }    inf = fopen( argv[1], "r" );    outf = fopen( argv[2], "w" );    i = inf && outf;    p4_send( 3, 1, &i, sizeof( int ) );    if (!i) {      printf( "Could not open %s.  Exiting.\n\n", inf?argv[2]:argv[1] );      return 1;    }    fprintf( stderr, "Ready to send.\n" );    PassVars( inf, outf, int,    P4INT, "%d\n",     msg );    PassVars( inf, outf, double, P4DBL, "%.15lg\n", msg );    PassVars( inf, outf, float,  P4FLT, "%.8g\n",   msg );    PassVars( inf, outf, long,   P4LNG, "%ld\n",    msg );        fclose( inf );  } else if (myid==1) {    tag = 1; from = 0;    p4_recv( &tag, &from, &msg, &len );    if (len=1 && *msg==0) return 1;    outf = fopen( (char *)msg, "w" );    p4_send( 2, 0, &outf, sizeof( FILE * ) );      /* tell 0 whether outf2 was opened */    if (!outf) return 1;    tag=3,from=0;    p4_recv( &tag, &from, &msg, &len );    if (!*((int *)msg)) {      return 1;    }      /* check with 0 whether inf or outf1 were opened */    fprintf( stderr, "Ready to receive.\n" );    PassVars( (FILE *)0, outf, int,    P4INT, "%d\n",     msg );    PassVars( (FILE *)0, outf, double, P4DBL, "%.15lg\n", msg );    PassVars( (FILE *)0, outf, float,  P4FLT, "%.8g\n",   msg );    PassVars( (FILE *)0, outf, long,   P4LNG, "%ld\n",    msg );  }  fclose( outf );  p4_msg_free( msg );}

⌨️ 快捷键说明

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