From ff95dd83503e99e50b32140a073c0a742c414cb1 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Sun, 30 Apr 2000 10:13:27 +0000 Subject: [PATCH] r17: Fixed MPI bugs --- src/ctrec.c | 58 +++++++++++++++++++++------------------------------- src/phm2rs.c | 6 +++++- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/src/ctrec.c b/src/ctrec.c index adfc2f1..f8c58ef 100644 --- a/src/ctrec.c +++ b/src/ctrec.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: ctrec.c,v 1.3 2000/04/30 04:06:13 kevin Exp $ +** $Id: ctrec.c,v 1.4 2000/04/30 10:13:27 kevin Exp $ ** $Log: ctrec.c,v $ +** Revision 1.4 2000/04/30 10:13:27 kevin +** Fixed MPI bugs +** ** Revision 1.3 2000/04/30 04:06:13 kevin ** Update Raysum i/o routines ** Fix MPI bug in ctrec (scatter_raysum) that referenced rs_global @@ -250,13 +253,10 @@ main (const int argc, char *const argv[]) if (mpi_ct.my_rank == 0) { rs_global = raysum_open (rs_name); raysum_read (rs_global); - print_raysum_info(rs_global); if (opt_verbose) { - printf ("Number of detectors: %d\n", rs_global->ndet); - printf (" Number of views: %d\n", rs_global->nview); - printf (" Remark: %s\n", rs_global->remark); + print_raysum_info(rs_global); } - + mpi_ndet = rs_global->ndet; mpi_nview = rs_global->nview; mpi_detinc = rs_global->det_inc; @@ -299,7 +299,6 @@ main (const int argc, char *const argv[]) rs_local = raysum_create (NULL, mpi_ct.local_work_units[mpi_ct.my_rank], mpi_ndet); if (opt_debug) { fprintf(stdout, "Created rs_local %lx for process %d: local views=%4d, local dets=%4d\n", (unsigned long int) rs_local, mpi_ct.my_rank, mpi_ct.local_work_units[mpi_ct.my_rank], mpi_ndet); - MPI_Barrier(mpi_ct.comm); } rs_local->ndet = mpi_ndet; @@ -341,6 +340,8 @@ main (const int argc, char *const argv[]) mpi_t1 = MPI_Wtime(); image_reconst (im_local, rs_local, opt_filter, opt_filter_param, opt_interp, opt_interp_param, opt_backproj, opt_trace); + if (opt_debug) + printf("Back from image_reconst in process %d\n", mpi_ct.my_rank); mpi_t2 = MPI_Wtime(); mpi_t = mpi_t2 - mpi_t1; MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm); @@ -360,8 +361,14 @@ main (const int argc, char *const argv[]) if (opt_verbose) mpi_t1 = MPI_Wtime(); for (ix = 0; ix < im_local->nx; ix++) { - MPI_Reduce(im_local->v[ix], im_global->v[ix], - im_local->ny, MPI_FLOAT, MPI_SUM, 0, mpi_ct.comm); + void *recvbuf = NULL; + if (mpi_ct.my_rank == 0) + recvbuf = im_global->v[ix]; + + if (opt_debug) + printf("Calling MPI_Reduce in process %2d for ix=%d\n", mpi_ct.my_rank, ix); + + MPI_Reduce(im_local->v[ix], recvbuf, im_local->ny, MPI_FLOAT, MPI_SUM, 0, mpi_ct.comm); } if (opt_verbose) { mpi_t2 = MPI_Wtime(); @@ -406,16 +413,9 @@ static void mpi_scatter_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_d if (mpi_ct.my_rank == 0) { for (iproc = 0; iproc < mpi_ct.nproc; iproc++) { - end_work_unit = mpi_ct.start_work_unit[iproc] - + mpi_ct.local_work_units[iproc] - - 1; - - if (opt_debug) - fprintf(stdout, "Sending rs data to process %d\n", iproc); + end_work_unit = mpi_ct.start_work_unit[iproc] + mpi_ct.local_work_units[iproc] - 1; for (iw = mpi_ct.start_work_unit[iproc]; iw <= end_work_unit; iw++) { - if (opt_debug) - fprintf(stdout, "Sending from process %2d to process %2d: view_angle=%8f, ndet=%5d\n", mpi_ct.my_rank, iproc, rs_global->view[iw]->view_angle, rs_global->view[iw]->ndet); MPI_Send(&rs_global->view[iw]->ndet, 1, MPI_INT, iproc, 0, mpi_ct.comm); MPI_Send(&rs_global->view[iw]->view_angle, 1, MPI_DOUBLE, iproc, 0, mpi_ct.comm); MPI_Send(rs_global->view[iw]->detval, rs_global->ndet, MPI_FLOAT, iproc, 0, mpi_ct.comm); @@ -423,33 +423,21 @@ static void mpi_scatter_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_d } } - if (opt_debug) { + if (opt_debug) fprintf(stdout, "Receiving rs data in process %d\n", mpi_ct.my_rank); - MPI_Barrier(mpi_ct.comm); - } end_work_unit = mpi_ct.local_work_units[mpi_ct.my_rank] - 1; for (iw = 0; iw <= end_work_unit; iw++) { MPI_Status status; - if (opt_debug) { - fprintf(stdout,"Receiving into rs_local from mpi_scatter_rs, process %2d: rs_local=%lx, ", mpi_ct.my_rank, (unsigned long int) rs_local); - fprintf(stdout,"iw=%4d, nrot=%4d, ndet=%4d, view=%lx, detval=%lx\n", iw, rs_local->nview, rs_local->ndet, (unsigned long int) rs_local->view[iw], (unsigned long int) rs_local->view[iw]->detval); - } - MPI_Recv(&rs_local->view[iw]->ndet, 1, MPI_INT, 0, 0, mpi_ct.comm, &status); MPI_Recv(&rs_local->view[iw]->view_angle, 1, MPI_DOUBLE, 0, 0, mpi_ct.comm, &status); MPI_Recv(rs_local->view[iw]->detval, rs_local->ndet, MPI_FLOAT, 0, 0, mpi_ct.comm, &status); - - if (opt_debug) { - fprintf(stdout, "Received view_angle=%8f, ndet=%5d\n", rs_local->view[iw]->view_angle, rs_local->view[iw]->ndet); - } } rs_local->nview = mpi_ct.local_work_units[mpi_ct.my_rank]; if (opt_debug) { MPI_Barrier(MPI_COMM_WORLD); fprintf(stdout, "Done with mpi_scatter_rs in process %2d\n", mpi_ct.my_rank); - exit(0); } } @@ -460,9 +448,9 @@ static void print_raysum_info(const RAYSUM *rs) printf ("Number of detectors: %d\n", rs->ndet); printf (" Number of views: %d\n", rs->nview); printf (" Remark: %s\n", rs->remark); - printf ("Piclen: %f\n", rs->piclen); - printf ("det_start: %f\n", rs->det_start); - printf ("det_inc: %f\n", rs->det_inc); - printf ("rot_start: %f\n", rs->rot_start); - printf ("rot_inc: %f\n", rs->rot_inc); + printf (" Piclen: %f\n", rs->piclen); + printf (" det_start: %f\n", rs->det_start); + printf (" det_inc: %f\n", rs->det_inc); + printf (" rot_start: %f\n", rs->rot_start); + printf (" rot_inc: %f\n", rs->rot_inc); } diff --git a/src/phm2rs.c b/src/phm2rs.c index 8c9d450..3ed5e97 100644 --- a/src/phm2rs.c +++ b/src/phm2rs.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: phm2rs.c,v 1.4 2000/04/30 04:06:13 kevin Exp $ +** $Id: phm2rs.c,v 1.5 2000/04/30 10:13:27 kevin Exp $ ** $Log: phm2rs.c,v $ +** Revision 1.5 2000/04/30 10:13:27 kevin +** Fixed MPI bugs +** ** Revision 1.4 2000/04/30 04:06:13 kevin ** Update Raysum i/o routines ** Fix MPI bug in ctrec (scatter_raysum) that referenced rs_global @@ -290,6 +293,7 @@ main (const int argc, char *const argv[]) mpi_ct_calc_work_units(opt_nview); if (mpi_ct.my_rank == 0) { rs_global = raysum_create_from_det (opt_outfile, det); + raysum_alloc_views(rs_global); } rs_local = raysum_create_from_det (NULL, det); -- 2.34.1