Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
surfCpuModel add execute on host
authorPaul Bédaride <paul.bedaride@gmail.com>
Fri, 11 Apr 2014 14:45:25 +0000 (16:45 +0200)
committerPaul Bédaride <paul.bedaride@gmail.com>
Fri, 11 Apr 2014 14:45:48 +0000 (16:45 +0200)
buildtools/Cmake/DefinePackages.cmake
examples/java/surfCpuModel/CpuConstantModel.java
examples/java/surfCpuModel/Receiver.java
examples/java/surfCpuModel/Sender.java
examples/java/surfCpuModel/TestCpuModel.java
examples/java/surfCpuModel/surf_cpu_model.tesh
src/bindings/java/surf.i
src/bindings/java/surf_swig.hpp
src/surf/cpu_interface.cpp
src/surf/cpu_interface.hpp

index 047cbd2..a518040 100644 (file)
@@ -510,6 +510,8 @@ set(JSURF_JAVA_GENERATED_SRC
   ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/TmgrTraceEvent.java
   ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/TmgrTrace.java
 
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/ActionList.java
+
   #enums
   ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/ActionState.java
   ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/ResourceState.java
index 7325355..7f7d418 100644 (file)
@@ -8,7 +8,6 @@ import java.util.ArrayList;
 public class CpuConstantModel extends CpuModel {
 
   private List<CpuConstant> cpus = new ArrayList<CpuConstant>();
-  private List<CpuConstantAction> actions = new ArrayList<CpuConstantAction>();
 
   public CpuConstantModel() {
     super("Cpu Constant");
@@ -16,50 +15,77 @@ public class CpuConstantModel extends CpuModel {
   }
 
   public Cpu createResource(String name, double[] power_peak, int pstate, double power_scale, TmgrTrace power_trace, int core, ResourceState state_initial, TmgrTrace state_trace, XbtDict cpu_properties) {
-    Msg.info("Create Resource Name: "+name);
-    CpuConstant res = new CpuConstant(this, name, cpu_properties, actions, 1, 1000, 1000);
+    Msg.info("New Cpu("+name+", "+power_peak[pstate]+", "+power_scale+")");
+
+    CpuConstant res = new CpuConstant(this, name, cpu_properties, core, power_peak[pstate], power_scale);
     cpus.add(res);
     Surf.setCpu(name, res);
     return res;
   }
 
-  public void setState(ResourceState state) {
-    Msg.info("setState");
-  }
-
   public double shareResources(double now) {
-    Msg.info("shareResource of "+cpus.size()+" cpu and "+actions.size()+" actions");
-    return now+1;
+    double res = -1;
+    for (int i=0; i<cpus.size();i++){
+      double tmp = cpus.get(i).share(now);
+      if (tmp!=-1 && (res==-1 || tmp<res))
+        res = tmp;
+    }
+    Msg.info("ShareResources at time "+res);
+    return res;
   }
 
   public void updateActionsState(double now, double delta) {
-    Msg.info("updateActionState of "+cpus.size()+" cpu and "+actions.size()+" actions");
+    Action[] actions = getRunningActionSet().getArray();
+    Msg.info("UpdateActionState of "+actions.length+" actions");
+    for (int i=0; i<actions.length; i++) {
+      CpuConstantAction action = (CpuConstantAction)actions[i];
+      action.update(delta);
+      if (!action.sleeping()) {
+        Msg.info("action remains "+action.getRemains()+" after delta of "+delta);
+        if (action.getRemains()==0.0){
+          action.setState(ActionState.SURF_ACTION_DONE);
+          Msg.info("action DONE");
+        }
+      }
+    }
   }
 
   public void addTraces() {
   }
 
 public class CpuConstant extends Cpu {
-  private List<CpuConstantAction> actions;
+  private List<CpuConstantAction> actions = new ArrayList<CpuConstantAction>();
 
   public CpuConstant(CpuConstantModel model, String name, XbtDict props,
-                     List<CpuConstantAction> actions,
                      int core, double powerPeak, double powerScale) {
     super(model, name, props, core, powerPeak, powerScale);
-    this.actions = actions;
+  }
+
+  public void remove(CpuConstantAction action){
+    actions.remove(action);
   }
 
   public CpuAction execute(double size) {
-    CpuConstantAction res = new CpuConstantAction(getModel(), size, false);
-    Msg.info("Execute action of size "+size);
+    CpuConstantAction res = new CpuConstantAction(getModel(), size, false, false, this);
+    Msg.info("Execute action of size "+size+" sleeping "+res.sleeping());
     actions.add(res);
     return res;
   }
 
   public CpuAction sleep(double duration) {
-    CpuConstantAction res = new CpuConstantAction(getModel(), duration, false);
-    Msg.info("Sleep action of duration "+duration);
-    actions.add(res);
+    CpuConstantAction res = new CpuConstantAction(getModel(), duration, false, true, this);
+    Msg.info("Sleep action of duration "+duration+" sleeping "+res.sleeping());
+    return res;
+  }
+
+  public double share(double now){
+    double res = -1;
+    for (int i=0; i<actions.size();i++){
+      double tmp = actions.get(i).getRemains()/getCurrentPowerPeak();
+      Msg.info("Share action with new time "+tmp);
+      if (res==-1 || tmp<res)
+        res = tmp;
+    }
     return res;
   }
 
@@ -69,9 +95,23 @@ public class CpuConstant extends Cpu {
 }
 
 public class CpuConstantAction extends CpuAction {
-  public CpuConstantAction(Model model, double cost, boolean failed) {
+  boolean sleep;
+  CpuConstant cpu;
+  public CpuConstantAction(Model model, double cost, boolean failed, boolean sleep, CpuConstant cpu) {
     super(model, cost, failed);
+    this.sleep = sleep;
+    this.cpu = cpu;
+  }
+
+  public void update(double delta){
+    updateRemains(delta*cpu.getCurrentPowerPeak());
+  }
+  public synchronized void delete() {
+    cpu.remove(this);
+    super.delete();
   }
+
+  public boolean sleeping() {return sleep;}
+  public void setPriority(double priority) {}
 }
 }
-
index bbfe7d2..41779a5 100644 (file)
@@ -24,8 +24,7 @@ public class Receiver extends Process {
 
       Task task;
       task = Task.receive(getHost().getName());
-      task = Task.receive(getHost().getName());
-      task = Task.receive(getHost().getName());
+      task.execute();
 
       Msg.info("goodbye!");
     }
index 5f6a47f..908dac4 100644 (file)
@@ -25,7 +25,7 @@ public class Sender extends Process {
 
        String receiverName = args[0];
        double oldTime, curTime;
-       double computeDuration = 10000;
+       double computeDuration = 10E8;
        Task task;
 
        oldTime = Msg.getClock();
@@ -34,18 +34,6 @@ public class Sender extends Process {
        curTime = Msg.getClock();
        Msg.info("Send duration: " + (curTime - oldTime));
 
-       oldTime = curTime;
-       task = new Task("no name",computeDuration,commSizeLat);
-       task.send(receiverName);
-       curTime = Msg.getClock();
-       Msg.info("Send duration with update bandwidth: " + (curTime - oldTime));
-
-       oldTime = curTime;
-       task = new Task("no name",computeDuration,commSizeLat);
-       task.send(receiverName);
-       curTime = Msg.getClock();
-       Msg.info("Send normal duration with limited bandwidth: " + (curTime - oldTime));
-
        Msg.info("goodbye!");
     }
 }
index 91345fd..5dc900f 100644 (file)
@@ -21,12 +21,10 @@ public class TestCpuModel {
 
   public static void main(String[] args) throws NativeException {
     /* initialize the MSG simulation. Must be done before anything else (even logging). */
-    CpuModel cm = new CpuConstantModel();
+    CpuConstantModel cm = new CpuConstantModel();
     Surf.setCpuModel(cm);
-    //Msg.info(Surf.getCpuModel().getName());
-    //Msg.info(cm.getName());
+
     Msg.init(args);
-    //Msg.info("Cpu Loaded: "+Surf.getCpuModel().getName());
 
     if(args.length < 2) {
       Msg.info("Usage   : TestPlugin platform_file deployment_file");
@@ -37,10 +35,8 @@ public class TestCpuModel {
     /* construct the platform and deploy the application */
     Msg.createEnvironment(args[0]);
     Msg.deployApplication(args[1]);
-    //Msg.info("Cpu Loaded: "+Surf.getCpuModel().getName());
-    //Msg.info("Cpu Loaded: "+cm.getName());
+    Msg.info("Cpu Loaded: "+Surf.getCpuModel().getName());
 
-    // getName());
     /*  execute the simulation. */
     Msg.run();
   }
index 2f0fd00..00a34ed 100644 (file)
@@ -4,39 +4,30 @@ $ java -classpath ${classpath:=.} surfCpuModel/TestCpuModel ${srcdir:=.}/surfCpu
 > [0.000000] [jmsg/INFO] Initialize Cpu Constant Model
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'workstation/model' to 'compound'
 > [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
-> [0.000000] [jmsg/INFO] Create Resource Name: Jacquelin
-> [0.000000] [jmsg/INFO] Create Resource Name: Boivin
-> [0.000000] [jmsg/INFO] Create Resource Name: TeX
-> [0.000000] [jmsg/INFO] updateActionState of 3 cpu and 0 actions
+> [0.000000] [jmsg/INFO] New Cpu(Jacquelin, 1.37333E8, 1.0)
+> [0.000000] [jmsg/INFO] New Cpu(Boivin, 9.8095E7, 1.0)
+> [0.000000] [jmsg/INFO] New Cpu(TeX, 6.8667E7, 1.0)
+> [0.000000] [jmsg/INFO] UpdateActionState of 0 actions
+> [0.000000] [jmsg/INFO] Cpu Loaded: Cpu Constant
 > [Jacquelin:surfCpuModel.Sender:(1) 0.000000] [jmsg/INFO] helloo!
 > [Boivin:surfCpuModel.Receiver:(2) 0.000000] [jmsg/INFO] helloo!
-> [0.000000] [jmsg/INFO] Sleep action of duration -1.0
-> [0.000000] [jmsg/INFO] Sleep action of duration -1.0
-> [0.000000] [jmsg/INFO] shareResource of 3 cpu and 2 actions
-> [0.000000] [jmsg/INFO] shareResource of 3 cpu and 2 actions
-> [0.026020] [jmsg/INFO] updateActionState of 3 cpu and 2 actions
-> [0.026020] [jmsg/INFO] shareResource of 3 cpu and 2 actions
-> [0.026020] [jmsg/INFO] shareResource of 3 cpu and 2 actions
-> [0.026021] [jmsg/INFO] updateActionState of 3 cpu and 2 actions
+> [0.000000] [jmsg/INFO] Sleep action of duration -1.0 sleeping true
+> [0.000000] [jmsg/INFO] Sleep action of duration -1.0 sleeping true
+> [0.000000] [jmsg/INFO] ShareResources at time -1.0
+> [0.000000] [jmsg/INFO] ShareResources at time -1.0
+> [0.026020] [jmsg/INFO] UpdateActionState of 2 actions
+> [0.026020] [jmsg/INFO] ShareResources at time -1.0
+> [0.026020] [jmsg/INFO] ShareResources at time -1.0
+> [0.026021] [jmsg/INFO] UpdateActionState of 2 actions
 > [Jacquelin:surfCpuModel.Sender:(1) 0.026021] [jmsg/INFO] Send duration: 0.026021030927835052
-> [0.026021] [jmsg/INFO] Sleep action of duration -1.0
-> [0.026021] [jmsg/INFO] Sleep action of duration -1.0
-> [0.026021] [jmsg/INFO] shareResource of 3 cpu and 4 actions
-> [0.026021] [jmsg/INFO] shareResource of 3 cpu and 4 actions
-> [0.052041] [jmsg/INFO] updateActionState of 3 cpu and 4 actions
-> [0.052041] [jmsg/INFO] shareResource of 3 cpu and 4 actions
-> [0.052041] [jmsg/INFO] shareResource of 3 cpu and 4 actions
-> [0.052042] [jmsg/INFO] updateActionState of 3 cpu and 4 actions
-> [Jacquelin:surfCpuModel.Sender:(1) 0.052042] [jmsg/INFO] Send duration with update bandwidth: 0.026021030927835052
-> [0.052042] [jmsg/INFO] Sleep action of duration -1.0
-> [0.052042] [jmsg/INFO] Sleep action of duration -1.0
-> [0.052042] [jmsg/INFO] shareResource of 3 cpu and 6 actions
-> [0.052042] [jmsg/INFO] shareResource of 3 cpu and 6 actions
-> [0.078062] [jmsg/INFO] updateActionState of 3 cpu and 6 actions
-> [0.078062] [jmsg/INFO] shareResource of 3 cpu and 6 actions
-> [0.078062] [jmsg/INFO] shareResource of 3 cpu and 6 actions
-> [0.078063] [jmsg/INFO] updateActionState of 3 cpu and 6 actions
-> [Boivin:surfCpuModel.Receiver:(2) 0.078063] [jmsg/INFO] goodbye!
-> [Jacquelin:surfCpuModel.Sender:(1) 0.078063] [jmsg/INFO] Send normal duration with limited bandwidth: 0.02602103092783506
-> [Jacquelin:surfCpuModel.Sender:(1) 0.078063] [jmsg/INFO] goodbye!
-> [0.078063] [jmsg/INFO] MSG_main finished; Cleaning up the simulation...
+> [Jacquelin:surfCpuModel.Sender:(1) 0.026021] [jmsg/INFO] goodbye!
+> [0.026021] [jmsg/INFO] Execute action of size 1.0E9 sleeping false
+> [0.026021] [jmsg/INFO] Share action with new time 10.194199500484224
+> [0.026021] [jmsg/INFO] ShareResources at time 10.194199500484224
+> [0.026021] [jmsg/INFO] Share action with new time 10.194199500484224
+> [0.026021] [jmsg/INFO] ShareResources at time 10.194199500484224
+> [10.220221] [jmsg/INFO] UpdateActionState of 1 actions
+> [10.220221] [jmsg/INFO] action remains 0.0 after delta of 10.194199500484224
+> [10.220221] [jmsg/INFO] action DONE
+> [Boivin:surfCpuModel.Receiver:(2) 10.220221] [jmsg/INFO] goodbye!
+> [10.220221] [jmsg/INFO] MSG_main finished; Cleaning up the simulation...
index ecb4b12..2be8718 100644 (file)
@@ -28,24 +28,118 @@ import org.simgrid.NativeLib;
 %}
 
 %{
+#include "src/surf/surf_interface.hpp"
 #include "src/surf/cpu_interface.hpp"
 #include "src/surf/network_interface.hpp"
 #include "src/surf/trace_mgr_private.h"
 #include "src/bindings/java/surf_swig.hpp"
 #include "src/xbt/dict_private.h"
+
 typedef struct lmm_constraint *lmm_constraint_t;
 typedef xbt_dynar_t DoubleDynar;
-/*class CpuModel : public CpuModel {
+%}
+
+%wrapper %{
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jobject JNICALL Java_org_simgrid_surf_SurfJNI_getAction(JNIEnv *env, jclass cls, jlong jarg1) {
+  Action * action = (Action *)jarg1;
+  jobject res;
+  CpuAction *cpu_action = dynamic_cast<CpuAction*>(action);
+  if (cpu_action) {
+    SwigDirector_CpuAction *dir_cpu_action = dynamic_cast<SwigDirector_CpuAction*>(cpu_action);
+    if (dir_cpu_action) {
+      res = dir_cpu_action->swig_get_self(env);\
+    } else {
+      jclass clss = env->FindClass("org/simgrid/surf/CpuAction");\
+      jmethodID constru = env->GetMethodID(clss, "<init>", "()V");\
+      res = env->NewObject(clss, constru);\
+      res = env->NewGlobalRef(res);\
+    }
+  } else {
+    jclass clss = env->FindClass("org/simgrid/surf/Action");\
+    jmethodID constru = env->GetMethodID(clss, "<init>", "()V");\
+    res = env->NewObject(clss, constru);\
+    res = env->NewGlobalRef(res);\
+  }
+  return res;
+}
+
+#define GETDIRECTOR(NAME) \
+JNIEXPORT jobject JNICALL Java_org_simgrid_surf_SurfJNI_get## NAME ## Director(JNIEnv *env, jclass cls, jlong jarg1)\
+{\
+  NAME * arg1 = (NAME*)jarg1;\
+  SwigDirector_ ##NAME *director = dynamic_cast<SwigDirector_ ##NAME *>(arg1);\
+  jobject res;\
+  if (director) {\
+    res = director->swig_get_self(env);\
+  } else {\
+    jclass clss = env->FindClass("org/simgrid/surf/NAME");\
+    jmethodID constru = env->GetMethodID(clss, "<init>", "()V");\
+    res = env->NewObject(clss, constru);\
+    res = env->NewGlobalRef(res);\
+  }\
+  return res;\
+}
+
+GETDIRECTOR(CpuModel)
+GETDIRECTOR(Cpu)
+GETDIRECTOR(CpuAction)
+
+#ifdef __cplusplus
+}
+#endif
 
-};*/
 %}
 
+%typemap(freearg) char* name {
+}
+
+/* Handle xbt_dynar_t of NetworkLink */
+JAVA_ARRAYSOFCLASSES(Action);
+%apply Action[] {ActionArrayPtr};
+%typemap(jstype) ActionArrayPtr "Action[]"
+%typemap(javain) ActionArrayPtr "Action.cArrayUnwrap($javainput)"
+%typemap(javaout) ActionArrayPtr {
+  long[] cArray = $jnicall;
+  Action[] arrayWrapper = new Action[cArray.length];
+  for (int i=0; i<cArray.length; i++)
+    arrayWrapper[i] = (Action) Surf.getAction(cArray[i]);
+  return arrayWrapper;
+  //   return Action.cArrayWrap($jnicall, $owner);
+}
+%typemap(out) ActionArrayPtr {
+  long l = 0;
+  for(ActionList::iterator it($1->begin()), itend($1->end()); it != itend ; ++it) {
+    l++;
+  }
+  $result = jenv->NewLongArray(l);
+  jlong *elts = jenv->GetLongArrayElements($result, NULL);
+  l = 0;
+  for(ActionList::iterator it($1->begin()), itend($1->end()); it != itend ; ++it) {
+    elts[l++] = (jlong)static_cast<ActionPtr>(&*it);
+  }
+  jenv->ReleaseLongArrayElements($result, elts, 0);
+}
+
+class ActionList {
+public:
+  //void push_front(Action &action);
+  //void push_back(Action &action);
+%extend {
+  ActionArrayPtr getArray(){
+    return $self;
+  }
+}
+};
+
 /* Handle xbt_dynar_t of NetworkLink */
 JAVA_ARRAYSOFCLASSES(NetworkLink);
 %apply NetworkLink[] {NetworkLinkDynar};
 %typemap(jstype) NetworkLinkDynar "NetworkLink[]"
 %typemap(javain) NetworkLinkDynar "NetworkLink.cArrayUnwrap($javainput)"
-
 %typemap(javaout) NetworkLinkDynar {
      return NetworkLink.cArrayWrap($jnicall, $owner);
 }
@@ -62,11 +156,6 @@ JAVA_ARRAYSOFCLASSES(NetworkLink);
   xbt_dynar_free(&$1);
 }
 
-/*%typemap(out) DoubleDynar {
-    $result = (double[])$1;
-}*/
-
-//typedef xbt_dynar_t DoubleDynar;
 %nodefault DoubleDynar;
 %typemap(jni) DoubleDynar "jdoubleArray"
 %rename(DoubleDynar) Double[];
@@ -93,6 +182,23 @@ JAVA_ARRAYSOFCLASSES(NetworkLink);
 /* Allow to subclass Plugin and send java object to C++ code */
 %feature("director") Plugin;
 
+%native(getAction) jobject getAction(jlong jarg1);
+%native(getCpuModelDirector) jobject getCpuModelDirector(jlong jarg1);
+%typemap(javaout) CpuModel * {
+  long cPtr = $jnicall;
+  return (CpuModel)Surf.getCpuModelDirector(cPtr);
+}
+%native(getCpuDirector) jobject getCpuDirector(jlong jarg1);
+%typemap(javaout) Cpu * {
+  long cPtr = $jnicall;
+  return (Cpu)Surf.getCpuDirector(cPtr);
+}
+%native(getCpuActionDirector) jobject getCpuActionDirector(jlong jarg1);
+%typemap(javaout) CpuAction * {
+  long cPtr = $jnicall;
+  return (CpuAction)Surf.getCpuDirector(cPtr);
+}
+
 %include "src/bindings/java/surf_swig.hpp"
 
 %rename tmgr_trace TmgrTrace;
@@ -125,7 +231,6 @@ struct tmgr_trace_event {
   }
 };
 
-
 %nodefaultctor Model;
 class Model {
 public:
@@ -138,6 +243,13 @@ public:
   virtual void updateActionsState(double now, double delta);
   virtual void updateActionsStateLazy(double now, double delta);
   virtual void updateActionsStateFull(double now, double delta);
+
+  virtual ActionList *getRunningActionSet();
+%extend {
+  Action *getRunningActionS() {
+    return (Action*)(&($self->getRunningActionSet()->front()));
+  }
+}
 };
 
 %feature("director") CpuModel;
@@ -154,7 +266,6 @@ public:
   virtual void addTraces()=0;
 };
 
-
 class Resource {
 public:
   Resource();
@@ -176,7 +287,7 @@ public:
   Cpu(Model *model, const char *name, s_xbt_dict *props,
     int core, double powerPeak, double powerScale);
   virtual ~Cpu();
-  virtual double getCurrentPowerPeak()=0;
+  virtual double getCurrentPowerPeak();
   virtual CpuAction *execute(double size)=0;
   virtual CpuAction *sleep(double duration)=0;
   virtual int getCore();
@@ -201,10 +312,18 @@ public:
 %nodefaultctor Action;
 class Action {
 public:
+  Action(Model *model, double cost, bool failed);
+  virtual ~Action();
   Model *getModel();
   lmm_variable *getVariable();
+  e_surf_action_state_t getState();
+  bool isSuspended();
   double getBound();
   void setBound(double bound);
+  void updateRemains(double delta);
+  virtual double getRemains();
+  virtual void setPriority(double priority);
+  virtual void setState(e_surf_action_state_t state);
 };
 
 %nodefaultctor CpuAction;
index 182ec97..4211ce1 100644 (file)
@@ -11,6 +11,8 @@
 #include "src/surf/maxmin_private.hpp"
 
 typedef xbt_dynar_t NetworkLinkDynar;
+typedef ActionList *ActionArrayPtr;
+
 double getClock();
 
 void clean();
@@ -20,7 +22,6 @@ void setCpuModel(CpuModel *cpuModel);
 
 void setCpu(char *name, Cpu *cpu);
 
-
 NetworkLinkDynar getRoute(char *srcName, char *dstName);
 
 class Plugin {
index 8fbf799..1a08d36 100644 (file)
@@ -207,6 +207,11 @@ Cpu::~Cpu(){
     xbt_free(p_constraintCoreId);
 }
 
+double Cpu::getCurrentPowerPeak()
+{
+  return m_powerPeak;
+}
+
 double Cpu::getSpeed(double load)
 {
   return load * m_powerPeak;
index f271150..b2f4e8a 100644 (file)
@@ -188,7 +188,7 @@ public:
    *
    * @return The current Cpu power peak
    */
-  virtual double getCurrentPowerPeak()=0;
+  virtual double getCurrentPowerPeak();
 
 
   virtual double getPowerPeakAt(int pstate_index)=0;