[3718] | 1 | // This may look like C code, but it is really -*- C++ -*-
|
---|
| 2 | // UPS - LAL (Orsay) / IN2P3/CNRS - IRFU/SPP (Saclay) / CEA
|
---|
| 3 | #ifndef PARLEX_SEEN
|
---|
| 4 | #define PARLEX_SEEN
|
---|
| 5 |
|
---|
| 6 | // Classes pour execution de taches paralleles en utilisant les threads
|
---|
[3855] | 7 | // R. Ansari UPS+LAL IN2P3/CNRS 2009-2010
|
---|
[3718] | 8 |
|
---|
| 9 | #include "zthread.h"
|
---|
| 10 | #include <vector>
|
---|
| 11 |
|
---|
| 12 | namespace SOPHYA {
|
---|
| 13 | using namespace std;
|
---|
| 14 |
|
---|
| 15 | //--------------------------------------------------------------------
|
---|
| 16 | // Interface pour les objets ayant une fonction (Execute()) pouvant
|
---|
| 17 | // s'executer en parallele
|
---|
| 18 | //--------------------------------------------------------------------
|
---|
| 19 | class ParallelTaskInterface {
|
---|
| 20 | public:
|
---|
[3855] | 21 | explicit ParallelTaskInterface();
|
---|
| 22 | virtual ~ParallelTaskInterface();
|
---|
[3718] | 23 | /*! This method should perform the actual computation. The parameter tid
|
---|
| 24 | is used by the ParallelExecutor class to identify the thread calling the method
|
---|
| 25 | */
|
---|
| 26 | virtual int execute(int tid) = 0;
|
---|
[3855] | 27 | //! Define the number of parallel threads running to perform the task (set by ParallelExecutor object)
|
---|
| 28 | virtual void setNbParallelThreads(int nbparthr);
|
---|
| 29 | //! Return the number of parallel threads running to perform the task
|
---|
| 30 | inline int getNbParallelThreads() { return nbparallel_; }
|
---|
| 31 | protected:
|
---|
| 32 | int nbparallel_; // total number of parallel threads which will perform the job
|
---|
[3718] | 33 | };
|
---|
| 34 |
|
---|
| 35 | //---- Implementation de ParallelTaskInterface pour l'execution des fonctions
|
---|
[3855] | 36 | //! Prototype for functions which executed by ParallelTaskFunction objects
|
---|
| 37 | typedef int (* ParalExFunction) (int,int);
|
---|
[3718] | 38 | //----
|
---|
[3855] | 39 | class ParallelTaskFunction : public ParallelTaskInterface {
|
---|
[3718] | 40 | public:
|
---|
| 41 | explicit ParallelTaskFunction(ParalExFunction f);
|
---|
| 42 | virtual int execute(int tid);
|
---|
| 43 |
|
---|
| 44 | ParalExFunction parfunc_;
|
---|
| 45 | };
|
---|
| 46 |
|
---|
| 47 | //--------------------------------------------------------------------
|
---|
| 48 | // Classe de thread permettant l'execution controle de la methode
|
---|
| 49 | // ParallelTaskInterface::Execute()
|
---|
| 50 | //--------------------------------------------------------------------
|
---|
| 51 | class ParalExThread : public ZThread {
|
---|
| 52 | public:
|
---|
| 53 | explicit ParalExThread(ParallelTaskInterface& ptask, int tid);
|
---|
| 54 | virtual void run();
|
---|
| 55 |
|
---|
| 56 | // demarre l'execution (start() doit etre appele avant)
|
---|
| 57 | //!
|
---|
| 58 | int go();
|
---|
| 59 | // Attend la fin de l'execution
|
---|
| 60 | int waitEndOfExecution();
|
---|
| 61 | // Termine (arrete) l'execution du thread . si fgwait==true, attend l'arret effectif du tread.
|
---|
| 62 | void terminate(bool fgwait=true);
|
---|
| 63 | // demarre l'execution et attend sa fin
|
---|
| 64 | //! Launches the execution of ptask_.execute() and waits for its ending.
|
---|
| 65 | inline int execute()
|
---|
| 66 | {
|
---|
| 67 | int rc=go();
|
---|
| 68 | if(rc!=0) return rc;
|
---|
| 69 | return waitEndOfExecution();
|
---|
| 70 | }
|
---|
| 71 | //! Return the the execution phase, 0: waiting, 1:go called, 2: executing, 3: execution finished
|
---|
| 72 | inline int getExecutionState() { return state_; }
|
---|
| 73 | //! Return true if an exception has been catched when ptask_.execute() called, and correspond message
|
---|
| 74 | inline bool IfException(string& msg)
|
---|
| 75 | { msg=msg_exc_; return fgexcept_; }
|
---|
| 76 |
|
---|
| 77 | //! Return reference to the parallel task object
|
---|
| 78 | inline ParallelTaskInterface& getParallelTask() { return ptask_; }
|
---|
| 79 | //! Set (changes) the parallel task object.
|
---|
| 80 | int setParallelTask(ParallelTaskInterface& ptask);
|
---|
| 81 | //! Return the rank or thread-id in a parallel execution context
|
---|
| 82 | inline int Rank() { return tid_; }
|
---|
| 83 |
|
---|
| 84 | protected:
|
---|
| 85 | ParallelTaskInterface& ptask_;
|
---|
| 86 | int tid_;
|
---|
| 87 | ZMutex mtx_;
|
---|
| 88 | int state_; // running state
|
---|
| 89 | // 0:idle, 1: go, 2: executing, 3: executionfinished , 6:terminatethread, 7:threadfinished
|
---|
| 90 | bool fgexcept_; // true -> exception lors de l'execution de ptask_.execute()
|
---|
| 91 | string msg_exc_; // message d'exception le cas echeant
|
---|
| 92 | };
|
---|
| 93 |
|
---|
| 94 | //--------------------------------------------------------------------
|
---|
| 95 | // Classe permettant l'execution simultanee de plusieurs fonctions
|
---|
| 96 | // ParallelTaskInterface::Execute()
|
---|
| 97 | //--------------------------------------------------------------------
|
---|
| 98 | class ParallelExecutor {
|
---|
| 99 | public:
|
---|
| 100 | explicit ParallelExecutor(ParallelTaskInterface& ptask, size_t nthr);
|
---|
| 101 | explicit ParallelExecutor(vector< ParallelTaskInterface * > vptask);
|
---|
| 102 | virtual ~ParallelExecutor();
|
---|
| 103 |
|
---|
| 104 | //! Set (changes) the parallel task objects (same object for all threads)
|
---|
| 105 | void SetParallelTask( ParallelTaskInterface& ptask );
|
---|
| 106 | //! Set (changes) the parallel task objects
|
---|
| 107 | void SetParallelTask( vector< ParallelTaskInterface * > vptask);
|
---|
| 108 |
|
---|
| 109 | //! Starts all the parallel threads
|
---|
| 110 | virtual void start();
|
---|
| 111 | // Appel a l'execution parallele
|
---|
| 112 | virtual int execute();
|
---|
| 113 | //! Return the number of parallel threads
|
---|
| 114 | inline size_t nThreads() { return vpext_.size(); }
|
---|
| 115 | //! Return RC for the ParalleTask.execute() of thread i
|
---|
| 116 | inline int getRC(size_t i) { return vrc_[i]; }
|
---|
[3855] | 117 | //! Return the exception condition for the ParalleTask.execute() of thread i
|
---|
[3718] | 118 | inline bool IfException(size_t i, string& msg) { return vpext_[i]->IfException(msg); }
|
---|
| 119 |
|
---|
| 120 | protected:
|
---|
| 121 | vector<ParalExThread *> vpext_;
|
---|
| 122 | vector<int> vrc_;
|
---|
| 123 | bool fgstarted_; // true -> les threads tournent (thr[i].start() appeles)
|
---|
| 124 | bool fgrunning_; // true -> en cours d'execution
|
---|
| 125 | };
|
---|
| 126 |
|
---|
| 127 | } // namespace SOPHYA
|
---|
| 128 |
|
---|
| 129 | #endif
|
---|