void sf_out(sf_file out /* output file */, int axis /* join axis */, const char *iname /* name of the input file */) /*< prepare output >*/ { char *oname, cmdline[SF_CMDLEN]; int ndim; off_t n[SF_MAX_DIM]; sf_file inp; FILE *ofile=NULL; ofile = sf_tempfile(&oname,"w+b"); fclose(ofile); snprintf(cmdline,SF_CMDLEN,"%s %s --dryrun=y < %s > %s", command,splitcommand,iname,oname); sf_system(cmdline); inp = sf_input(oname); ndim = sf_largefiledims (inp,n); if (axis > ndim) axis=ndim; snprintf(nkey,5,"n%d",axis); axis--; sizes(inp,axis,ndim,n,&size1,&size2); sf_setformat(out,sf_histstring(inp,"data_format")); sf_fileflush(out,inp); sf_setform(out,SF_NATIVE); sf_rm(oname,true,false,false); }
void sf_join(sf_file out /* output file */, int job /* job number */) /*< join outputs >*/ { int i, chunk; off_t i2, left, nbuf; char *iname, *oname; sf_file in; iname = inames[job]; oname = onames[job]; in = sf_input(oname); sf_histint(in,nkey,&chunk); sf_setform(in,SF_NATIVE); for (i2=0; i2 < size2; i2++) { nbuf=BUFSIZ; for (left=chunk*size1; left > 0; left -= nbuf) { if (nbuf > left) nbuf=left; sf_charread(buffer,nbuf,in); sf_charwrite(buffer,nbuf,out); } } sf_fileclose(in); sf_rm(iname,true,false,false); sf_rm(oname,true,false,false); for (i=0; i < inpargc; i++) { iname = inpnames[job][i]; sf_rm(iname,true,false,false); } }
int main (int argc, char *argv[]) { int i; char *arg; bool force = false, verb = false, inquire = false; sf_init(argc,argv); for (i=1; i < argc; i++) { arg = argv[i]; if ('-' == arg[0]) { /* it is an option */ if (NULL != strchr(arg,'f')) force = true; if (NULL != strchr(arg,'v')) verb = true; if (NULL != strchr(arg,'i')) inquire = true; } else { /* it is a file */ sf_rm(arg, force, verb, inquire); } } exit (0); }
int main(int argc, char* argv[]) { int axis, axis2, rank, nodes, node, ndim, jobs; off_t n[SF_MAX_DIM]; char *iname=NULL, **cmdline; FILE *tmp; sf_file inp, out, inp2; #pragma omp parallel { nodes = omp_get_num_threads(); if (1 >= nodes) nodes = omp_get_num_procs(); } /* master node */ sf_init(argc,argv); inp = sf_input("in"); out = sf_output("out"); ndim = sf_largefiledims (inp,n); if (!sf_getint("split",&axis)) axis=ndim; /* axis to split */ tmp = sf_tempfile(&iname,"w+b"); fclose(tmp); inp2 = sf_output(iname); sf_cp(inp,inp2); sf_fileclose(inp2); inp2 = sf_input(iname); cmdline = sf_split(inp2,axis,nodes+1,&jobs,ndim,n,argc,argv); sf_warning("Running %d threads",jobs); #pragma omp parallel { omp_set_num_threads(jobs); } #pragma omp parallel private(rank) shared(cmdline) { rank = omp_get_thread_num(); if (rank < jobs) { fprintf(stderr,"CPU %d: %s\n",rank,cmdline[rank]); sf_system(cmdline[rank]); } } if (!sf_getint("join",&axis2)) axis2=axis; /* axis to join (0 means add) */ sf_out(out,axis2,iname); sf_rm(iname,true,false,false); if (axis2 > 0) { for (node=0; node < jobs; node++) { sf_join(out,node); } } else { sf_add(out,jobs); } exit(0); }
void sf_add(sf_file out, int jobs) /*< add outputs >*/ { int *ibuf=NULL, job, i; float *fbuf=NULL; char buffout[BUFSIZ]; sf_complex *cbuf=NULL; sf_datatype type; size_t nbuf=BUFSIZ; off_t nsiz; char *oname; sf_file *ins; type = sf_gettype(out); switch(type) { case SF_FLOAT: fbuf = (float*) buffout; nbuf /= sizeof(float); for (i=0; i < nbuf; i++) { fbuf[i] = 0.0f; } break; default: sf_error("wrong type"); break; } ins = (sf_file*) sf_alloc(jobs,sizeof(sf_file)); for (job=0; job < jobs; job++) { oname = onames[job]; ins[job] = sf_input(oname); } for (nsiz = size2; nsiz > 0; nsiz -= nbuf) { if (nbuf > nsiz) nbuf=nsiz; for (job=0; job < jobs; job++) { switch(type) { case SF_FLOAT: sf_floatread((float*) buffer,nbuf,ins[job]); for (i=0; i < nbuf; i++) { if (job) { fbuf[i] += ((float*) buffer)[i]; } else { fbuf[i] = ((float*) buffer)[i]; } } break; default: sf_error("wrong type"); break; } } switch(type) { case SF_FLOAT: sf_floatwrite(fbuf,nbuf,out); break; case SF_COMPLEX: sf_complexwrite(cbuf,nbuf,out); break; case SF_INT: sf_intwrite(ibuf,nbuf,out); break; default: sf_error("wrong type"); break; } } for (job=0; job < jobs; job++) { sf_fileclose(ins[job]); sf_rm(inames[job],true,false,false); sf_rm(onames[job],true,false,false); for (i=0; i < inpargc; i++) { oname = inpnames[job][i]; sf_rm(oname,true,false,false); } } free(ins); }