#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #define MPI_STRING ((MPI_Datatype)34) /*#define ARGV_DEBUG*/ #ifdef FLOAT_HACK # undef MPI_FLOAT # define MPI_FLOAT MPI_DOUBLE #endif #include "utils.c" /* don't ask- mpicc hoses up these definitions */ #undef VERSION #undef XS_VERSION #define VERSION "0.03" #define XS_VERSION "0.03" MODULE = Parallel::MPI PACKAGE = Parallel::MPI PROTOTYPES: DISABLE double constant(name,arg) char * name int arg int MPI_Comm_size(comm) MPI_Comm comm PREINIT: int d; CODE: MPIpm_errhandler("MPI_Comm_size", MPI_Comm_size(comm,&d)); RETVAL = d; OUTPUT: RETVAL int MPI_Comm_rank(comm) MPI_Comm comm PREINIT: int d; CODE: MPIpm_errhandler("MPI_Comm_rank", MPI_Comm_rank(comm,&d)); RETVAL = d; OUTPUT: RETVAL void MPI_Init() PREINIT: AV *args_av; SV **sv_tmp; SV *sv_tmp2; SV *argv0; int argc; char **argv; int i; CODE: /* Get @ARGV */ args_av = perl_get_av("main::ARGV", TRUE); if(args_av == NULL) croak("Parallel::MPI: $ARGV not set. Oops"); /* Get $0 */ argv0 = perl_get_sv("main::0", FALSE); if(argv0 == NULL) croak("Parallel::MPI: $0 not set. Oops"); /* We can't run MPI from a -e or a - script. */ if(!strncmp(SvPV(argv0, PL_na), "-", 1) || !strncmp(SvPV(argv0, PL_na), "-e", 2)) croak("Parallel::MPI: Cannot use MPI with command line script"); /* debug */ #ifdef ARGV_DEBUG printf("[%d] av_len=%d\n",getpid(),av_len(args_av)); for (i=0 ; i <= av_len(args_av) ; i++) { sv_tmp = av_fetch(args_av,i,0); printf("[%d] $ARGV[%d]=%s\n",getpid(),i,SvPV(*sv_tmp, PL_na)); } #endif /* argc = $#ARGV+1 +1 for argv[0] */ argc = av_len(args_av)+2; if (argc == 1) { croak("MPI_Init: no arguments found in the argv"); } else { /* build up argv by setting argv[0] from $0 and the rest from @ARGV We add an extra NULL to prevent a coredump during global destruction */ argv = (char**) malloc((argc+1) * sizeof(char*)); argv[0] = strdup(SvPV(argv0, PL_na)); for(i=1; i 1) { av_extend(args_av, argc-1); av_clear(args_av); for(i=1;i (av_len(stuff)+1)) { printf("MPI_Send: count param is larger than given array. Using " "array length.\n"); count = av_len(stuff)+1; } #ifdef SEND_DEBUG printf("[%d] av_len=%d\n",getpid(),av_len(stuff)); for (i=0 ; i <= av_len(stuff) ; i++) { SV **sv_tmp = av_fetch(stuff,i,0); if (sv_tmp == NULL) printf("[%d] $stuff[%d]=undef\n",getpid(),i); else { printf("[%d] $stuff[%d]=%s\n",getpid(),i,SvPV(*sv_tmp, PL_na)); } } #endif /* SEND_DEBUG */ len = MPIpm_packarray(&buf, stuff, datatype, count); #ifdef SEND_DEBUG printf("[%d] len=%d\n[%d] ", getpid(), len, getpid()); for(i=0;i