Parallel object programming in c++ (pop-c++) : demo

Description

Voici un programme de démo qui a été écrit dans une extension de C++ (POP-C++). C'est un programme tout simple qui montre la création d'objets parallèles.

POP-C++ est un outil qui permet de faire tourner un programme orienté objet en parallèle sur plusieurs machines (sous Linux). C'est un logiciel libre qui étend le langage C++ et permet de transformer très simplement des classes C++ en des classes parallèles. Les objets parallèles générés peuvent alors tourner indépendamment sur plusieurs machines.

POP-C++ contient entre autre :
- Un parseur qui génère le code de ces objets parallèles
- Une gestion des threads pour permettre d'appeler des méthodes de manière synchrone/asynchrone ...
- Une gestion des protocoles de communication, en particulier les socket tcpip, afin de passer des structures de données complexes entre différents objets.
- ...

Si vous êtes intéressés ou désirez installer le programme, je vous invite à visiter le wiki de POP-C++ et en particulier la page tutoriel :

http://gridgroup.hefr.ch/popc/index.php/Quick_start

Source / Exemple :


////// Fichier POPCobject.ph
#ifndef POPCOBJECT_PH_
#define POPCOBJECT_PH_

#include <timer.h>

parclass POPCobject
{
  classuid(1500);

  public:
    POPCobject(int newID, int wanted, int minp) @{od.power(wanted, minp);};
    POPCobject(int newID, paroc_string machine) @{od.url(machine);};
    ~POPCobject();
    
    async seq void sendIDto([in] POPCobject &o);
    sync conc int getID();
    async conc void recAnID(int i);
    sync mutex void wait(int sec);
  
  private:
    int iD;
    Timer timer;
    double initTime, computeTime;
    
};

#endif /*POPCOBJECT_PH_*/

////// Fichier POPCobject.cc

#include "POPCobject.ph"
#include <unistd.h>

POPCobject::POPCobject(int newID, int wanted, int minp)
{
  printf("POPCobject with ID=%d created (by JobMgr) on machine:%s\n", newID, (const char*)paroc_system::GetHost()); 
  iD=newID;
}

POPCobject::POPCobject(int newID, paroc_string machine)
{
  printf("POPCobject with ID=%d created on machine:%s\n", newID, (const char*)paroc_system::GetHost()); 
  iD=newID;
}

POPCobject::~POPCobject()
{
  printf("POPCobject:%d on machine:%s is being destroyed\n", iD, (const char*)paroc_system::GetHost()); 
  iD=-1;
}

void POPCobject::sendIDto(POPCobject &o)
{
  printf("POPCobject:%d on machine:%s is sending his iD to object:%d\n", iD, (const char*)paroc_system::GetHost(), o.getID()); 
  o.recAnID(iD);
}

int  POPCobject::getID()
{
  return iD;
}

void POPCobject::recAnID(int i)
{
  printf("POPCobject:%d on machine:%s is receiving id = %d\n", iD, (const char*)paroc_system::GetHost(), i);   
}

void POPCobject::wait(int sec)
{
  printf("POPCobject:%d on machine:%s is waiting %d sec.\n", iD, (const char*)paroc_system::GetHost(), sec);
  sleep(sec);
}

@pack(POPCobject);

////// Fichier main.cc
#include "POPCobject.ph"

int main(int argc, char** argv)

{
  if (argc<2)
  {
    printf("Usage: parocrun objmap %s NbObjects machine1, machine2, .... \n", argv[0]);
    return 0;
  }
  else
  {
    int nbObjects = atoi(argv[1]);
    POPCobject** objects=new POPCobject*[nbObjects]; 

    printf("\nSTART of %s program with %d objects\n", argv[0], nbObjects);

    for (int i = 0; i<argc-2; i++){ 
	  if(argv[i+2][0]=='-'){
		// objects created by job manager
		objects[i]=new POPCobject(i+1, 60, 40);	
	  }
	  else
	  {
		// objects created on a given hostname
		objects[i]=new POPCobject(i+1, argv[i+2]);
	  }
	}
    // The rest is created using hostname=localhost
    for (int i = argc-2; i<nbObjects; i++) objects[i]=new POPCobject(i+1, (paroc_string)("localhost"));
	    
    // Send IDs to each other
    for (int i=0; i<(nbObjects-1); i++) objects[i]->sendIDto(*(objects[i+1]));
    objects[nbObjects-1]->sendIDto(*(objects[0]));
    objects[nbObjects-1]->wait(2);
    for (int i=0; i<nbObjects; i++) delete objects[i];
    delete objects;
  }
  printf("\nEND of %s program\n", argv[0]);
  return 0;
}

Conclusion :


L'output ressemble à cela :

parocrun object.map ./main 2 localhost 192.168.0.202

START of ./main program with 2 objects
POPCobject with ID=1 created on machine:160.98.20.78
POPCobject with ID=2 created on machine:192.168.0.202
POPCobject:1 on machine:160.98.20.78 is sending his iD to object:2
POPCobject:2 on machine:192.168.0.202 is receiving id = 1
POPCobject:2 on machine:192.168.0.202 is sending his iD to object:1
POPCobject:1 on machine:160.98.20.78 is receiving id = 2
POPCobject:2 on machine:192.168.0.202 is waiting 2 sec.

END of ./main program
POPCobject:1 on machine:160.98.20.78 is being destroyed
[objectmonitor.cc:82]Check parallel objects....0 object alive
/*-------------------------------------------------------------------------------*/

Questions et remarques sont les bienvenues !

PS:
Le code de POP-C++ ne tenait pas dans le .zip. Il faudra aller sur le site pour le télécharger. Je vous conseille vivement de prendre la version béta des sources de POP-C++. Le tutoriel ci-dessus explique l'installation.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.