[Debian-astro-commits] [gyoto] 22/221: MPI actually working, at least for quantity "intensity".

Thibaut Jean-Claude Paumard thibaut at moszumanska.debian.org
Fri May 22 20:52:30 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 87e22922c0b79bad3ba4163476824b237a9d7e03
Author: Thibaut Paumard <paumard at users.sourceforge.net>
Date:   Wed Oct 8 18:17:28 2014 +0200

    MPI actually working, at least for quantity "intensity".
---
 bin/gyoto-mpi-worker.C              | 83 +++++++++++++++++++++++++++++++++----
 doc/examples/example-fixed-star.xml |  2 +
 include/GyotoScenery.h              |  2 -
 lib/Photon.C                        |  4 +-
 lib/Scenery.C                       | 28 +++++++++++--
 5 files changed, 105 insertions(+), 14 deletions(-)

diff --git a/bin/gyoto-mpi-worker.C b/bin/gyoto-mpi-worker.C
index e0096f1..24fa563 100644
--- a/bin/gyoto-mpi-worker.C
+++ b/bin/gyoto-mpi-worker.C
@@ -113,9 +113,6 @@ int main(int argc, char** argv) {
   Gyoto::Register::init(pluglist.c_str());
 
   int rk=world.rank();
-  srand(rk);
-  long delay;
-
 
   //Gyoto::debug(1);
 
@@ -133,18 +130,90 @@ int main(int argc, char** argv) {
       curmsg = "In gyoto.C: Error in Factory creation: ";
       curretval = 1;
       sc = Factory(const_cast<char*>(parfile.c_str())).getScenery();
+      cerr <<"Maxiter=="<<sc->maxiter()<<endl;
       break;
     }
     case Scenery::raytrace: {
       size_t ij[2]={0, 0};
       //      std::cerr << "Worker #" << rk << " receiving ij for raytracing" <<std::endl;
       manager.recv(0, task, ij, 2);
-      delay=long(double(rand())/double(RAND_MAX)*1e6);
-      std::cerr << "Worker #" << rk << " raytracing i="<<ij[0]<<", j="<<ij[1]
-		<<" (actually sleeping for "<<delay<<"µs)"<<std::endl;
-      usleep(delay);
+      std::cerr << "Worker #" << rk << " raytracing i="<<ij[0]<<", j="<<ij[1]<<std::endl;
+
+
+      // initialize AstrobjProperties
+      size_t nbnuobs=0;
+      Quantity_t quantities = sc -> getRequestedQuantities();
+      if (quantities & (GYOTO_QUANTITY_SPECTRUM | GYOTO_QUANTITY_BINSPECTRUM)) {
+	SmartPointer<Spectrometer::Generic> spr = sc -> screen() -> spectrometer();
+	if (!spr) throwError("Spectral quantity requested but "
+			     "no spectrometer specified!");
+	nbnuobs = spr -> nSamples();
+      }
+      size_t nbdata= sc->getScalarQuantitiesCount();
+      size_t nelt=(nbdata+nbnuobs);
+      vect = new double[nelt];
+      data = new Astrobj::Properties();
+      size_t offset=1;
+      size_t curquant=0;
+
+      if (quantities & GYOTO_QUANTITY_INTENSITY) {
+	data->intensity=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_EMISSIONTIME) {
+	data->time=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_MIN_DISTANCE) {
+	data->distance=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_FIRST_DMIN) {
+	data->first_dmin=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_REDSHIFT) {
+	data->redshift=vect+offset*(curquant++);
+      }
+      // if ((quantities & GYOTO_QUANTITY_IMPACTCOORDS || ipct) && !ipctdims[0] ) {
+      // 	data->impactcoords = impactcoords = new double [res*res*16];
+      // 	ipcttime = tobs * GYOTO_C / scenery -> metric() -> unitLength();
+      // }
+      if (quantities & GYOTO_QUANTITY_USER1) {
+	data->user1=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_USER2) {
+	data->user2=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_USER3) {
+	data->user3=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_USER4) {
+	data->user4=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_USER5) {
+	data->user5=vect+offset*(curquant++);
+      }
+      if (quantities & GYOTO_QUANTITY_SPECTRUM) {
+	data->spectrum=vect+offset*(curquant++);
+	data->offset=int(offset);
+      }
+      if (quantities & GYOTO_QUANTITY_BINSPECTRUM) {
+	data->binspectrum=vect+offset*(curquant++);
+	data->offset=int(offset);
+      }
+
+      data->init(nbnuobs);
+      sc->screen()->computeBaseVectors();
+      sc->setPropertyConverters(data);
+
+      // need to do something about impactcoords
+
+      (*sc)(ij[0], ij[1], data, NULL, NULL);
 
       manager.send(0, Scenery::raytrace_done, rk);
+      manager.send(0, Scenery::raytrace_done, ij, 2);
+      manager.send(0, Scenery::raytrace_done, nelt);
+      manager.send(0, Scenery::raytrace_done, vect, nelt);
+
+      delete[] vect;
+      delete data;
       //      std::cerr << "Worker #" << rk << " done raytracing i="<<ij[0]<<", j="<<ij[1]<<std::endl;
 
     }
diff --git a/doc/examples/example-fixed-star.xml b/doc/examples/example-fixed-star.xml
index 02b5ab5..f1c961d 100644
--- a/doc/examples/example-fixed-star.xml
+++ b/doc/examples/example-fixed-star.xml
@@ -44,4 +44,6 @@
     Intensity[mJy.sr-1]
     Intensity[Jy.sr-1]
 
+  <NProcesses>12</NProcesses>
+
 </Scenery>
diff --git a/include/GyotoScenery.h b/include/GyotoScenery.h
index 5f39211..d003b3f 100644
--- a/include/GyotoScenery.h
+++ b/include/GyotoScenery.h
@@ -211,8 +211,6 @@ class Gyoto::Scenery : protected Gyoto::SmartPointee {
   Gyoto::SmartPointer<Gyoto::Units::Converter> binspectrum_converter_;
 # endif
 
-  size_t maxiter_ ; ///< Maximum number of iterations when integrating
-
 # ifdef HAVE_MPI
   boost::mpi::environment * mpi_env_;
   boost::mpi::communicator * mpi_world_;
diff --git a/lib/Photon.C b/lib/Photon.C
index f6d4b9d..06171d9 100644
--- a/lib/Photon.C
+++ b/lib/Photon.C
@@ -326,8 +326,8 @@ int Photon::hit(Astrobj::Properties *data) {
     }
 
     if ( ++count > maxiter_ ) {
-      GYOTO_SEVERE << "Photon::hit: too many iterations, "
-		   <<" break" << endl;
+      GYOTO_SEVERE << "Photon::hit: too many iterations ("<<count<<" vs. "
+		   << maxiter_<<"), break" << endl;
       stopcond = 1;
       break;
     }
diff --git a/lib/Scenery.C b/lib/Scenery.C
index 124a85f..9ff7630 100644
--- a/lib/Scenery.C
+++ b/lib/Scenery.C
@@ -249,6 +249,7 @@ void Scenery::rayTrace(size_t imin, size_t imax,
 
     size_t ij[2]={imin, jmin};
     int working = 0;
+    if (data) data->init(0);
 
     // initiate raytracing
     for (int w=0; w<mpi_workers_->remote_size(); ++w) {
@@ -272,10 +273,28 @@ void Scenery::rayTrace(size_t imin, size_t imax,
       // receive one result, need to track back where it belongs and
       // store it there
       int w;
+      size_t nelt;
+      double * vect;
+      size_t ijr[2];
       cerr << "Manager waiting for worker to send result" << endl;
       mpi_workers_ -> recv(mpi::any_source, raytrace_done, w);
       cerr << "Manager received result from worker #"<<w << endl;
 
+      mpi_workers_ -> recv(w, raytrace_done, ijr, 2);
+      mpi_workers_ -> recv(w, raytrace_done, nelt);
+      vect=new double[nelt];
+      mpi_workers_ -> recv(w, raytrace_done, vect, nelt);
+
+      Astrobj::Properties *databis=data;
+      databis += (ijr[1]-1)*npix+ijr[0];
+      size_t offset=1;
+      size_t curquant=0;
+   
+      if (data->intensity) data->intensity[(ijr[1]-1)*npix+ijr[0]]=*(vect+offset*(curquant++));
+      //populate other quantities
+
+      delete[] vect;
+
       // give new task or decrease working counter
       if (ij[0]<=imax) {
 	mpi_workers_ -> send(w, give_task, raytrace);
@@ -631,7 +650,7 @@ void Scenery::fillElement(FactoryMessenger *fmp) {
   fmp -> setParameter("RelTol", ph_.relTol());
   fmp -> setParameter ("Delta", delta_);
   fmp -> setParameter (adaptive()?"Adaptive":"NonAdaptive");
-  fmp -> setParameter("MaxIter", maxiter_);
+  fmp -> setParameter("MaxIter", maxiter());
 
   if (getRequestedQuantities())
     fmp -> setParameter("Quantities", getRequestedQuantitiesString());
@@ -654,6 +673,8 @@ SmartPointer<Scenery> Gyoto::Scenery::Subcontractor(FactoryMessenger* fmp) {
 
   SmartPointer<Scenery> sc = new Scenery(gg, scr, ao);
 
+  int mpi=0;
+
   while (fmp->getNextParameter(&name, &content, &unit)) {
     char* tc = const_cast<char*>(content.c_str());
     if (name=="Delta")       sc -> delta(atof(tc), unit);;
@@ -670,12 +691,13 @@ SmartPointer<Scenery> Gyoto::Scenery::Subcontractor(FactoryMessenger* fmp) {
     if (name=="DeltaMaxOverR") sc -> ph_ . deltaMaxOverR (atof(content.c_str()));
     if (name=="AbsTol")    sc -> ph_ . absTol(atof(content.c_str()));
     if (name=="RelTol")    sc -> ph_ . relTol(atof(content.c_str()));
+    if (name=="NProcesses")  mpi=atoi(tc);
 
   }
 #ifdef HAVE_MPI
 
-  if (!Scenery::is_worker) {
-    sc -> mpiSpawn(5);
+  if (!Scenery::is_worker && mpi) {
+    sc -> mpiSpawn(mpi);
     sc -> mpiClone();
   }
 

-- 
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