// $Id: assoc-master.cc 374 2007-11-10 11:34:27Z cactus $ -*- c++ -*- #include #include "pvm3.h" #include #include #include "pipeline.h" int main (int argc, char** argv) { int tidSelf = pvm_mytid (); std::vector rgf; for (int i = 1; i <= 100; ++i) rgf.push_back (0.8 + (i / 100.0)); // Create and register children int n = 5; std::vector rgtid (n); if (pvm_spawn ("pipeline-worker", 0, 0, 0, n, &rgtid[0]) != n) { std::cerr << "spawn failed" << std::endl; return pvm_exit (); } for (int i = 0; i != n; ++i) { pvm_initsend (PvmDataDefault); int tidPrev = i > 0 ? rgtid[i - 1] : tidSelf; int tidNext = i + 1 < n ? rgtid[i + 1] : tidSelf; pvm_pkint (&i, 1, 1); pvm_pkint (&tidPrev, 1, 1); pvm_pkint (&tidNext, 1, 1); pvm_send (rgtid[i], MSG_INIT); } int tidFirst = rgtid[0]; // Send data for (std::vector::const_iterator i = rgf.begin (); i != rgf.end (); ++i) { pvm_initsend (PvmDataDefault); pvm_pkfloat (const_cast(&*(i)), 1, 1); pvm_send (tidFirst, MSG_DATA); } pvm_initsend (PvmDataDefault); pvm_send (tidFirst, MSG_DONE); int tidLast = rgtid[n - 1]; // Request results std::vector rgfResult (rgf.size ()); for (unsigned int i = 0; i != rgf.size (); ++i) { pvm_recv (tidLast, MSG_DATA); pvm_upkfloat (&rgfResult[0] + i, 1, 1); std::cout << rgf[i] << " " << rgfResult[i] << std::endl; } std::cout << "Finished." << std::endl; return pvm_exit(); }