[Debian-astro-commits] [gyoto] 54/221: MPI: give work to the workers before copying data

Thibaut Jean-Claude Paumard thibaut at moszumanska.debian.org
Fri May 22 20:52:33 UTC 2015


This is an automated email from the git hooks/post-receive script.

thibaut pushed a commit to branch master
in repository gyoto.

commit b7cb430940d7961fbb69ffcf3c749ed90de5bfc2
Author: Thibaut Paumard <paumard at users.sourceforge.net>
Date:   Wed Oct 15 14:25:49 2014 +0200

    MPI: give work to the workers before copying data
---
 lib/Scenery.C | 68 +++++++++++++++++++++++++++++++----------------------------
 1 file changed, 36 insertions(+), 32 deletions(-)

diff --git a/lib/Scenery.C b/lib/Scenery.C
index 3fba783..c7f8181 100644
--- a/lib/Scenery.C
+++ b/lib/Scenery.C
@@ -1,5 +1,5 @@
 /*
-    Copyright 2011, 2013 Thibaut Paumard, Frederic Vincent
+    Copyright 2011, 2013-2014 Thibaut Paumard, Frederic Vincent
 
     This file is part of Gyoto.
 
@@ -400,37 +400,7 @@ void Scenery::rayTrace(size_t imin, size_t imax,
 
 	w = s.source();
 	
-	if (s.tag()==Scenery::raytrace_done && data) {
-	  // Copy each relevant quantity, performing conversion if needed
-	  if (data->intensity)
-	    data->intensity[cell[w]]=data->intensity_converter_?
-	      (*data->intensity_converter_)(*locdata->intensity):
-	      *locdata->intensity;
-	  if (data->time) data->time[cell[w]]=*locdata->time;
-	  if (data->distance) data->distance[cell[w]]=*locdata->distance;
-	  if (data->first_dmin) data->first_dmin[cell[w]]=*locdata->first_dmin;
-	  if (data->redshift) data->redshift[cell[w]]=*locdata->redshift;
-	  if (data->impactcoords)
-	    for (size_t k=0; k<16; ++k)
-	      data->impactcoords[cell[w]*16+k]=locdata->impactcoords[k];
-	  if (data->user1) data->user1[cell[w]]=*locdata->user1;
-	  if (data->user2) data->user2[cell[w]]=*locdata->user2;
-	  if (data->user3) data->user3[cell[w]]=*locdata->user3;
-	  if (data->user4) data->user4[cell[w]]=*locdata->user4;
-	  if (data->user5) data->user5[cell[w]]=*locdata->user5;
-	  if (data->spectrum)
-	    for (size_t c=0; c<nbnuobs; ++c)
-	      data->spectrum[cell[w]+c*data->offset]=
-		data->spectrum_converter_?
-		(*data->spectrum_converter_)(locdata->spectrum[c]):
-		locdata->spectrum[c];
-	  if (data->binspectrum)
-	    for (size_t c=0; c<nbnuobs; ++c)
-	      data->binspectrum[cell[w]+c*data->offset]=
-		data->binspectrum_converter_?
-		(*data->binspectrum_converter_)(locdata->binspectrum[c]):
-		locdata->binspectrum[c];
-	}
+	size_t cs=cell[w]; // remember where to store results
 
 	// give new task or decrease working counter
 	if (ij[0]<=imax) {
@@ -455,6 +425,40 @@ void Scenery::rayTrace(size_t imin, size_t imax,
 	  mpi_team_ -> send(w, raytrace_done, ij, 2);
 	  --working;
 	}
+
+	// Now that the worker is back to work, triage data it has just delivered
+	if (s.tag()==Scenery::raytrace_done && data) {
+	  // Copy each relevant quantity, performing conversion if needed
+	  if (data->intensity)
+	    data->intensity[cs]=data->intensity_converter_?
+	      (*data->intensity_converter_)(*locdata->intensity):
+	      *locdata->intensity;
+	  if (data->time) data->time[cs]=*locdata->time;
+	  if (data->distance) data->distance[cs]=*locdata->distance;
+	  if (data->first_dmin) data->first_dmin[cs]=*locdata->first_dmin;
+	  if (data->redshift) data->redshift[cs]=*locdata->redshift;
+	  if (data->impactcoords)
+	    for (size_t k=0; k<16; ++k)
+	      data->impactcoords[cs*16+k]=locdata->impactcoords[k];
+	  if (data->user1) data->user1[cs]=*locdata->user1;
+	  if (data->user2) data->user2[cs]=*locdata->user2;
+	  if (data->user3) data->user3[cs]=*locdata->user3;
+	  if (data->user4) data->user4[cs]=*locdata->user4;
+	  if (data->user5) data->user5[cs]=*locdata->user5;
+	  if (data->spectrum)
+	    for (size_t c=0; c<nbnuobs; ++c)
+	      data->spectrum[cs+c*data->offset]=
+		data->spectrum_converter_?
+		(*data->spectrum_converter_)(locdata->spectrum[c]):
+		locdata->spectrum[c];
+	  if (data->binspectrum)
+	    for (size_t c=0; c<nbnuobs; ++c)
+	      data->binspectrum[cs+c*data->offset]=
+		data->binspectrum_converter_?
+		(*data->binspectrum_converter_)(locdata->binspectrum[c]):
+		locdata->binspectrum[c];
+	}
+
       }
       if (verbose()) cout << endl;
     } else {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-astro/packages/gyoto.git



More information about the Debian-astro-commits mailing list