int main(int argc, char *argv[])
{
  int rank;
  int nproc;
  FILE *input;

  MPI_Init(&argc,&argv);
  MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  MPI_Comm_size(MPI_COMM_WORLD,&nproc);
  if ( nproc<2 && rank==0 )
    {
      fprintf(stderr,"%s:  At least 2 MPI processes required!\n",argv[0]);
      exit(-1);
    }
  if ( rank==0 )
    {
      if ( argc>1 )
	{
	  input = fopen(argv[1],"r");
	}
      else
	{
	  input = stdin;
	}
      mastermind(nproc-1,input);
    }
  else
    {
      minion(rank);
    }
  MPI_Finalize();
  return(0);
}
Example #2
0
    Worker::Worker(const std::vector<uint>& jobIDs, const WorkerSettings& settings)
        : context_(1), heartbeat_(context_, settings.heartbeat)
    {
      // Setup sockets 
      std::unique_ptr<zmq::socket_t> minion(new zmq::socket_t(context_, ZMQ_ROUTER));
      std::unique_ptr<zmq::socket_t> heartbeat(new zmq::socket_t(context_, ZMQ_PAIR));
      std::unique_ptr<zmq::socket_t> network(new zmq::socket_t(context_, ZMQ_DEALER));
      minion->bind(WORKER_SOCKET_ADDR.c_str());
      heartbeat->bind(CLIENT_HB_SOCKET_ADDR.c_str());
      auto networkSocketID = stateline::comms::randomSocketID();
      stateline::comms::setSocketID(networkSocketID, *(network));
      std::string address = "tcp://" + settings.address;
      LOG(INFO)<< "Worker connecting to " << address;
      network->connect(address.c_str());
      // Transfer sockets to the router
      router_.add_socket(SocketID::MINION, minion);
      router_.add_socket(SocketID::HEARTBEAT, heartbeat);
      router_.add_socket(SocketID::NETWORK, network);

      // Specify the Worker functionality
      auto onRcvJOBREQUEST = [&] (const Message&m)
      { forwardToNetwork(m, this->router_);};
      auto onRcvJOB = [&] (const Message&m)
      { forwardToMinion(m, this->router_);};
      auto onRcvJOBSWAP = [&] (const Message&m)
      { forwardToNetwork(m, this->router_);};

      auto fForwardToHB = [&] (const Message&m)
      { this->router_.send(SocketID::HEARTBEAT, m);};
      auto fForwardToNetwork = [&] (const Message&m)
      { this->router_.send(SocketID::NETWORK,m);};
      auto fDisconnect = [&] (const Message&m)
      { disconnectFromServer(m);};

      // Bind functionality to the router
      router_(SocketID::MINION).onRcvJOBREQUEST.connect(onRcvJOBREQUEST);
      router_(SocketID::NETWORK).onRcvJOB.connect(onRcvJOB);
      router_(SocketID::MINION).onRcvJOBSWAP.connect(onRcvJOBSWAP);

      router_(SocketID::NETWORK).onRcvHEARTBEAT.connect(fForwardToHB);
      router_(SocketID::NETWORK).onRcvHELLO.connect(fForwardToHB);
      router_(SocketID::NETWORK).onRcvGOODBYE.connect(fForwardToHB);
      router_(SocketID::HEARTBEAT).onRcvHEARTBEAT.connect(fForwardToNetwork);
      router_(SocketID::HEARTBEAT).onRcvGOODBYE.connect(fDisconnect);

      // Initialise the connection and problemspec
      router_.send(SocketID::NETWORK, Message(HELLO, { serialise(jobIDs) }));
      auto msgProblemSpec = router_.receive(SocketID::NETWORK);
      VLOG(3) << "Received " << msgProblemSpec;
      globalSpec_ = msgProblemSpec.data[0];
      uint index = 1;

      while (index + 3 <= msgProblemSpec.data.size())
      {
        uint jobid = std::stoi(msgProblemSpec.data[index++]);
        jobsEnabled_.insert(jobid);
        std::string spec = msgProblemSpec.data[index++];
        std::string readings = msgProblemSpec.data[index++];
        jobSpecs_.insert(std::make_pair(jobid, spec));
        jobResults_.insert(std::make_pair(jobid, readings));
      }

      LOG(INFO)<< "Problem Specification Initialised";

      // Start the router and heartbeating
      router_.start(settings.msPollRate);
      heartbeat_.start();
    }
Example #3
0
void Board::play(Card card, Turn turn, int target /*no target*/)
{
	minions[turn].push_back(minion(card));
	//TODO: interact with board...
}