]> SALOME platform Git repositories - modules/yacs.git/commitdiff
Salome HOME
WIP
authorAnthony Geay <anthony.geay@edf.fr>
Fri, 27 Mar 2020 22:07:44 +0000 (23:07 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Fri, 27 Mar 2020 22:07:44 +0000 (23:07 +0100)
src/engine/Bloc.hxx
src/engine/Bloc_impl.cxx
src/engine/HomogeneousPoolContainer.cxx
src/engine/HomogeneousPoolContainer.hxx
src/engine/PlayGround.cxx
src/engine/PlayGround.hxx
src/runtime/SalomeContainerTools.cxx
src/runtime/SalomeContainerTools.hxx
src/runtime/SalomeHPContainer.cxx
src/yacsloader_swig/Test/testFEDyn.py
src/yacsloader_swig/Test/testFEDyn2.py [new file with mode: 0644]

index a6288c8b03f3c74ed845d6df3d34570fd5cbf87b..da46d314d5de36e39476350c3f68fe80c6f017fe 100644 (file)
@@ -70,6 +70,7 @@ namespace YACS
       void removeRecursivelyRedundantCL();
       void partitionRegardingDPL(const PartDefinition *pd, std::map<ComposedNode *, YACS::BASES::AutoRefCnt<PartDefinition> >& zeMap);
       void fitToPlayGround(const PlayGround *pg);
+      void propagePlayGround(const PlayGround *pg);
     protected:
       bool areAllSubNodesFinished() const;
       bool areAllSubNodesDone() const;
index 21e83bcc7a6feb6eeb8bc8e04afd77c2a6430d3b..0fe584cdba9d989a9e1efad5a1ae855eb2a61544 100644 (file)
@@ -108,3 +108,46 @@ void Bloc::fitToPlayGround(const PlayGround *pg)
     (*it)->setSizeOfPool(pg->getNumberOfWorkers((*it)->getNumberOfCoresPerWorker()));
   //FIXME
 }
+
+void Bloc::propagePlayGround(const PlayGround *pg)
+{
+  static const char MSG[]="Bloc::propagePlayGround : Not implemented yet for this type of node !";
+  class MyVisitor : public Visitor
+    {
+    public:
+      MyVisitor(ComposedNode *root):Visitor(root) { }
+      void visitBloc(Bloc *node) { node->ComposedNode::accept(this); }
+      void visitElementaryNode(ElementaryNode *node) { }
+      void visitForEachLoop(ForEachLoop *node) { throw YACS::Exception(MSG); }
+      void visitForEachLoopDyn(ForEachLoopDyn *node) { }
+      void visitOptimizerLoop(OptimizerLoop *node) { throw YACS::Exception(MSG); }
+      void visitDynParaLoop(DynParaLoop *node) { throw YACS::Exception(MSG); }
+      void visitForLoop(ForLoop *node) { throw YACS::Exception(MSG); }
+      void visitInlineNode(InlineNode *node)
+      {
+          Container *cont(node->getContainer());
+          HomogeneousPoolContainer *cont2(dynamic_cast<HomogeneousPoolContainer *>(cont));
+          if(!cont2)
+            return ;
+          _cont2.insert(cont2);
+      }
+      void visitInlineFuncNode(InlineFuncNode *node) { throw YACS::Exception(MSG); }
+      void visitLoop(Loop *node) { throw YACS::Exception(MSG); }
+      void visitProc(Proc *node) { node->ComposedNode::accept(this); }
+      void visitServiceNode(ServiceNode *node) { throw YACS::Exception(MSG); }
+      void visitServerNode(ServerNode *node) { throw YACS::Exception(MSG); }
+      void visitServiceInlineNode(ServiceInlineNode *node) { throw YACS::Exception(MSG); }
+      void visitSwitch(Switch *node) { throw YACS::Exception(MSG); }
+      void visitWhileLoop(WhileLoop *node) { throw YACS::Exception(MSG); }
+      void visitPresetNode(DataNode *node) { throw YACS::Exception(MSG); }
+      void visitOutNode(DataNode *node) { throw YACS::Exception(MSG); }
+      void visitStudyInNode(DataNode *node) { throw YACS::Exception(MSG); }
+      void visitStudyOutNode(DataNode *node) { throw YACS::Exception(MSG); }
+    public:
+      std::set< HomogeneousPoolContainer * > _cont2;
+  };
+  MyVisitor vis(this);
+  this->accept(&vis);
+  for(auto cont : vis._cont2)
+    cont->assignPG(pg);
+}
\ No newline at end of file
index 5f0ec2ddc23c0e62bedc1d7f6545865e481a11e1..089990e0103e039783e9ba3f142069fc844e71ab 100644 (file)
@@ -40,6 +40,11 @@ void HomogeneousPoolContainer::setAttachOnCloningStatus(bool val) const
     throw Exception("An HomogeneousPoolContainer cannot be detached on cloning #2 !");
 }
 
+void HomogeneousPoolContainer::assignPG(const PlayGround *pg)
+{
+  _pg.takeRef(pg);
+}
+
 void HomogeneousPoolContainer::dettachOnCloning() const
 {
   _isAttachedOnCloning=true;
index eabf75416474ac5fc4b775f26da58933daa0de81..778316bb66ba061704f6e38bb760fad74060ef2f 100644 (file)
@@ -43,6 +43,7 @@ namespace YACS
       void dettachOnCloning() const;
       bool isAttachedOnCloning() const;
       void setAttachOnCloningStatus(bool val) const;
+      void assignPG(const PlayGround *pg);
       //
       virtual void setSizeOfPool(int sz) = 0;
       virtual int getSizeOfPool() const = 0;
@@ -57,6 +58,8 @@ namespace YACS
 #ifndef SWIG
       virtual ~HomogeneousPoolContainer();
 #endif
+    private:
+      YACS::BASES::AutoConstRefCnt<PlayGround> _pg;
     };
   }
 }
index de89ba4c181a20d0921194e0ffa9bc4d40ce65a2..a962358f944b1625c4c8db3095c8aaae56aa16bc 100644 (file)
@@ -34,11 +34,11 @@ std::string PlayGround::printSelf() const
 {
   std::ostringstream oss;
   std::size_t sz(0);
-  for(std::vector< std::pair<std::string,int> >::const_iterator it=_data.begin();it!=_data.end();it++)
-    sz=std::max(sz,(*it).first.length());
-  for(std::vector< std::pair<std::string,int> >::const_iterator it=_data.begin();it!=_data.end();it++)
+  for(auto it : _data)
+    sz=std::max(sz,it.name().length());
+  for(auto it : _data)
     {
-      oss << " - " << std::setw(10) << (*it).first << " : " << (*it).second << std::endl;
+      oss << " - " << std::setw(10) << it.name() << " : " << it.nbCores() << std::endl;
     }
   return oss.str();
 }
@@ -54,15 +54,15 @@ void PlayGround::loadFromKernelCatalog()
 
 void PlayGround::setData(const std::vector< std::pair<std::string,int> >& defOfRes)
 {
-  _data=defOfRes;
+  _data=std::vector<Resource>(defOfRes.begin(),defOfRes.end());
   checkCoherentInfo();
 }
 
 int PlayGround::getNumberOfCoresAvailable() const
 {
   int ret(0);
-  for(std::vector< std::pair<std::string,int> >::const_iterator it=_data.begin();it!=_data.end();it++)
-    ret+=(*it).second;
+  for(auto it : _data)
+    ret+=it.nbCores();
   return ret;
 }
 
@@ -71,8 +71,8 @@ int PlayGround::getMaxNumberOfContainersCanBeHostedWithoutOverlap(int nbCoresPer
   if(nbCoresPerCont<1)
     throw Exception("PlayGround::getMaxNumberOfContainersCanBeHostedWithoutOverlap : invalid nbCoresPerCont. Must be >=1 !");
   int ret(0);
-  for(std::vector< std::pair<std::string,int> >::const_iterator it=_data.begin();it!=_data.end();it++)
-    ret+=(*it).second/nbCoresPerCont;
+  for(auto it : _data)
+    ret+=it.nbCores()/nbCoresPerCont;
   return ret;
 }
 
@@ -80,18 +80,18 @@ std::vector<int> PlayGround::computeOffsets() const
 {
   std::size_t sz(_data.size()),i(0);
   std::vector<int> ret(sz+1); ret[0]=0;
-  for(std::vector< std::pair<std::string,int> >::const_iterator it=_data.begin();it!=_data.end();it++,i++)
-    ret[i+1]=ret[i]+(*it).second;
+  for(auto it=_data.begin();it!=_data.end();it++,i++)
+    ret[i+1]=ret[i]+it->nbCores();
   return ret;
 }
 
 void PlayGround::checkCoherentInfo() const
 {
   std::set<std::string> s;
-  for(std::vector< std::pair<std::string,int> >::const_iterator it=_data.begin();it!=_data.end();it++)
+  for(auto it : _data)
     {
-      s.insert((*it).first);
-      if((*it).second<0)
+      s.insert(it.name());
+      if(it.nbCores()<0)
         throw Exception("Presence of negative int value !");
     }
   if(s.size()!=_data.size())
@@ -162,16 +162,16 @@ std::vector<std::size_t> PlayGround::getWorkerIdsFullyFetchedBy(int nbCoresPerCo
 {
   std::size_t posBg(0),posWorker(0);
   std::vector<std::size_t> ret;
-  for(std::vector< std::pair<std::string,int> >::const_iterator it=_data.begin();it!=_data.end();it++)
+  for(auto it : _data)
     {
-      int nbWorker((*it).second/nbCoresPerComp);
+      int nbWorker(it.nbCores()/nbCoresPerComp);
       for(int j=0;j<nbWorker;j++,posWorker++)
         {
           std::vector<bool>::const_iterator it2(std::find(coreFlags.begin()+posBg+j*nbCoresPerComp,coreFlags.begin()+posBg+(j+1)*nbCoresPerComp,false));
           if(it2==coreFlags.begin()+posBg+(j+1)*nbCoresPerComp)
             ret.push_back(posWorker);
         }
-      posBg+=(*it).second;
+      posBg+=it.nbCores();
     }
   return ret;
 }
@@ -436,7 +436,7 @@ int PlayGround::fromWorkerIdToResId(int workerId, int nbProcPerNode) const
   std::size_t sz2(_data.size());
   std::vector<int> deltas(sz2+1); deltas[0]=0;
   for(std::size_t i=0;i<sz2;i++)
-    deltas[i+1]=deltas[i]+(_data[i].second)/nbProcPerNode;
+    deltas[i+1]=deltas[i]+(_data[i].nbCores())/nbProcPerNode;
   int zePos(0);
   while(zePos<sz2 && (workerId<deltas[zePos] || workerId>=deltas[zePos+1]))
     zePos++;
@@ -451,7 +451,7 @@ int PlayGround::fromWorkerIdToResId(int workerId, int nbProcPerNode) const
 std::string PlayGround::deduceMachineFrom(int workerId, int nbProcPerNode) const
 {
   int zePos(fromWorkerIdToResId(workerId,nbProcPerNode));
-  return _data[zePos].first;
+  return _data[zePos].name();
 }
 
 /*! 
index 39b61d21bcefab2dbbaf7c301047b3cf92210245..07e9f081307b3de4dc6eebf60b595eaa2c2b0d63 100644 (file)
@@ -33,16 +33,48 @@ namespace YACS
 {
   namespace ENGINE
   {
-    class PartDefinition;   
+    class PartDefinition;
+
+    class YACSLIBENGINE_EXPORT Resource
+    {
+    public:
+      Resource(const std::string& name, int nbCores):_name(name),_nbCores(nbCores),_occupied(_nbCores,false) { }
+      Resource(const std::pair<std::string,int>& p):_name(p.first),_nbCores(p.second),_occupied(_nbCores,false) { }
+      std::pair<std::string,int> toPair() const { return {_name,_nbCores}; }
+      int nbCores() const { return _nbCores; }
+      std::string name() const { return _name; }
+    private:
+      std::string _name;
+      int _nbCores;
+      std::vector<bool> _occupied;
+    };
+    
+    
+    class ResourceIterator : public std::iterator<
+                        std::input_iterator_tag,     // iterator_category
+                        Resource,                    // value_type
+                        long,                        // difference_type
+                        const Resource*,             // pointer
+                        std::pair<std::string,int> > // reference
+    {
+      const std::vector< Resource > *_vec;
+      std::size_t _num;
+    public:
+      explicit ResourceIterator(const std::vector< Resource > *vec, const std::size_t num) : _vec(vec),_num(num) { }
+      ResourceIterator& operator++() { _num++; return *this; }
+      bool operator==(ResourceIterator other) const { return _num == other._num; }
+      bool operator!=(ResourceIterator other) const { return !(*this == other); }
+      reference operator*() const { return (*_vec)[_num].toPair(); }
+    };
     
     class YACSLIBENGINE_EXPORT PlayGround : public RefCounter
     {
     public:
-      PlayGround(const std::vector< std::pair<std::string,int> >& defOfRes):_data(defOfRes) { checkCoherentInfo(); }
+      PlayGround(const std::vector< std::pair<std::string,int> >& defOfRes):_data(defOfRes.begin(),defOfRes.end()) { checkCoherentInfo(); }
       PlayGround() { }
       std::string printSelf() const;
       void loadFromKernelCatalog();
-      std::vector< std::pair<std::string,int> > getData() const { return _data; }
+      std::vector< std::pair<std::string,int> > getData() const { return std::vector< std::pair<std::string,int> >(ResourceIterator(&_data,0),ResourceIterator(&_data,_data.size())); }
       void setData(const std::vector< std::pair<std::string,int> >& defOfRes);
       int getNumberOfCoresAvailable() const;
       int getMaxNumberOfContainersCanBeHostedWithoutOverlap(int nbCoresPerCont) const;
@@ -67,7 +99,7 @@ namespace YACS
     private:
       ~PlayGround();
     private:
-      std::vector< std::pair<std::string,int> > _data;
+      std::vector< Resource > _data;
     };
 
     class YACSLIBENGINE_EXPORT PartDefinition : public RefCounter
index aaf96813f95e203a948dc75bc651136a3c3a7bea..6ef7b149d7377d71ba7dbd221a97e10241f70cd1 100644 (file)
@@ -230,6 +230,11 @@ std::string SalomeContainerTools::getContainerName() const
   return std::string(_params.container_name);
 }
 
+int SalomeContainerTools::getNumberOfCoresPerWorker() const
+{
+  return _params.resource_params.nb_proc_per_node;
+}
+
 void SalomeContainerTools::setContainerName(const std::string& name)
 {
   SetContainerNameOf(_params,name);
index 44e37926e197bf86e5014681e1bf8be5d814955f..bf27eef97e608dc0cbae5c4080815fce75aac401 100644 (file)
@@ -50,10 +50,12 @@ namespace YACS
       void addToResourceList(const std::string& name);
     public:
       std::string getContainerName() const;
+      int getNumberOfCoresPerWorker() const;
       void setContainerName(const std::string& name);
       std::string getNotNullContainerName(const Container *contPtr, const Task *askingNode, bool& isEmpty) const;
       std::string getHostName() const;
       Engines::ContainerParameters getParameters() const { return _params; }
+
       static void SetContainerNameOf(Engines::ContainerParameters& params, const std::string& name);
     public:
       static void Start(const std::vector<std::string>& compoNames, SalomeContainerHelper *schelp, SalomeContainerTools& sct, int& shutdownLevel, const Container *cont, const Task *askingNode);
index 1cbc1e00092b30fac83ef58999f59611f8617026..990ad25e340f93a767191d935501159b2b5f6d4f 100644 (file)
@@ -216,12 +216,10 @@ void SalomeHPContainer::checkCapabilityToDealWith(const ComponentInstance *inst)
 
 std::vector<std::string> SalomeHPContainer::getKernelContainerNames() const
 {
-  throw Exception("FIXME");
-  //return _launchModeType->getKernelContainerNames();
+  return _launchModeType.getKernelContainerNames(this);
 }
 
 int SalomeHPContainer::getNumberOfCoresPerWorker() const
 {
-  throw Exception("FIXME");
-  //return _sct.getNumberOfCoresPerWorker();
+  return _sct.getNumberOfCoresPerWorker();
 }
\ No newline at end of file
index 135eae2e9d07d504f9fa7763391edab48b9dbc9e..6f16c0c9977db3fb22559421f6e22bbecf4cdbdc 100644 (file)
@@ -12,7 +12,13 @@ p=r.createProc("prTest1")
 td=p.createType("double","double")
 ti=p.createType("int","int")
 cont=p.createContainer("gg","HPSalome")
-cont.setSizeOfPool(4)
+cont.setProperty("nb_proc_per_node","1")
+#
+pg=pilot.PlayGround()
+#pg.loadFromKernelCatalog()
+pg.setData([("localhost",8)])
+#
+#cont.setSizeOfPool(4)
 cont.setProperty("name","localhost")
 cont.setProperty("hostname","localhost")
 ti=p.createType("int","int")
@@ -73,13 +79,14 @@ p.saveSchema(fname)
 p=l.load(fname)
 p.saveSchema(fname2)
 p.init()
-ex=pilot.ExecutorSwig()
+p.propagePlayGround(pg)
+"""ex=pilot.ExecutorSwig()
 assert(p.getState()==pilot.READY)
 stt = datetime.datetime.now()
 ex.RunW(p,0)
 print(str(datetime.datetime.now()-stt))
 assert(p.getState()==pilot.DONE)
 o4=p.getChildByName("n2").getOutputPort("o4")
-assert(o4.getPyObj()==[0, 5, 10, 15, 20, 25, 30, 35])
+assert(o4.getPyObj()==[0, 5, 10, 15, 20, 25, 30, 35])"""
 # Ideal ForEachDyn time = 22 s
 # ForEach time = 40 s"""
\ No newline at end of file
diff --git a/src/yacsloader_swig/Test/testFEDyn2.py b/src/yacsloader_swig/Test/testFEDyn2.py
new file mode 100644 (file)
index 0000000..8b72aa2
--- /dev/null
@@ -0,0 +1,70 @@
+import pilot
+import SALOMERuntime
+import loader
+import datetime
+
+fname="testFEDyn.xml"
+fname2="REtestFEDyn.xml"
+SALOMERuntime.RuntimeSALOME.setRuntime()
+l=loader.YACSLoader()
+r=SALOMERuntime.getSALOMERuntime()
+p=r.createProc("prTest1")
+td=p.createType("double","double")
+ti=p.createType("int","int")
+cont=p.createContainer("gg","HPSalome")
+cont.setProperty("nb_proc_per_node","1")
+#
+pg=pilot.PlayGround()
+#pg.loadFromKernelCatalog()
+pg.setData([("localhost",8)])
+#
+cont.setSizeOfPool(1)
+cont.setProperty("name","localhost")
+cont.setProperty("hostname","localhost")
+ti=p.createType("int","int")
+tsi=p.createSequenceTc("seqint","seqint",ti)
+# Level0
+n0=r.createScriptNode("","n0")
+o0=n0.edAddOutputPort("o0",tsi)
+n0.setScript("o0=[ elt for elt in range(8) ]")
+p.edAddChild(n0)
+n1=r.createForEachLoopDyn("n1",ti)#Dyn
+#n1.getInputPort("nbBranches").edInitPy(2)
+n10=r.createScriptNode("","n10")
+n10.setExecutionMode("remote")
+n10.setContainer(cont)
+n1.edAddChild(n10)
+n10.setScript("""
+import time
+time.sleep(0.1)
+o2=2*i1
+""")
+i1=n10.edAddInputPort("i1",ti)
+o2=n10.edAddOutputPort("o2",ti)
+p.edAddChild(n1)
+p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
+p.edAddLink(n1.edGetSamplePort(),i1)
+p.edAddCFLink(n0,n1)
+n2=r.createScriptNode("","n2")
+n2.setScript("o4=i3")
+i3=n2.edAddInputPort("i3",tsi)
+o4=n2.edAddOutputPort("o4",tsi)
+n2.setScript("o4=[a for a in i3]")
+p.edAddChild(n2)
+p.edAddCFLink(n1,n2)
+p.edAddLink(o2,i3)
+#
+p.saveSchema(fname)
+p=l.load(fname)
+p.saveSchema(fname2)
+p.init()
+ex=pilot.ExecutorSwig()
+assert(p.getState()==pilot.READY)
+stt = datetime.datetime.now()
+ex.RunW(p,0)
+print(str(datetime.datetime.now()-stt))
+assert(p.getState()==pilot.DONE)
+o4=p.getChildByName("n2").getOutputPort("o4")
+assert(o4.getPyObj()==[0, 2, 4, 6, 8, 10, 12, 14])
+# Ideal ForEachDyn time = 22 s
+# ForEach time = 40 s"""
\ No newline at end of file