Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
kill a useless accessor
[simgrid.git] / src / simix / RawContext.cpp
index 96cedd1..67ebc54 100644 (file)
@@ -83,36 +83,17 @@ ContextFactory* raw_factory()
 
 // ***** Loads of static stuff
 
-#ifdef HAVE_THREAD_CONTEXTS
+#if HAVE_THREAD_CONTEXTS
 static xbt_parmap_t raw_parmap;
 static simgrid::simix::RawContext** raw_workers_context;    /* space to save the worker context in each thread */
 static uintptr_t raw_threads_working;     /* number of threads that have started their work */
 static xbt_os_thread_key_t raw_worker_id_key; /* thread-specific storage for the thread id */
 #endif
-#ifdef ADAPTIVE_THRESHOLD
-#define SCHED_ROUND_LIMIT 5
-static xbt_os_timer_t round_time;
-static double par_time,seq_time;
-static double par_ratio,seq_ratio;
-static int reached_seq_limit, reached_par_limit;
-static unsigned int par_proc_that_ran = 0,seq_proc_that_ran = 0;  /* Counters of processes that have run in SCHED_ROUND_LIMIT scheduling rounds */
-static unsigned int seq_sched_round=0, par_sched_round=0; /* Amount of SR that ran serial/parallel*/
-/*Varables used to calculate running variance and mean*/
-static double prev_avg_par_proc=0,prev_avg_seq_proc=0;
-static double delta=0;
-static double s_par_proc=0,s_seq_proc=0; /*Standard deviation of number of processes computed in par/seq during the current simulation*/
-static double avg_par_proc=0,sd_par_proc=0;
-static double avg_seq_proc=0,sd_seq_proc=0;
-static long long par_window=(long long)HUGE_VAL,seq_window=0;
-#endif
 static unsigned long raw_process_index = 0;   /* index of the next process to run in the
                                                * list of runnable processes */
 static simgrid::simix::RawContext* raw_maestro_context;
 
 static bool raw_context_parallel = false;
-#ifdef ADAPTIVE_THRESHOLD
-static bool raw_context_adaptative = false;
-#endif
 
 // ***** Raw context routines
 
@@ -123,7 +104,9 @@ extern "C" raw_stack_t raw_makecontext(void* malloced_stack, int stack_size,
                                    rawctx_entry_point_t entry_point, void* arg);
 extern "C" void raw_swapcontext(raw_stack_t* old, raw_stack_t new_context);
 
-#if PROCESSOR_x86_64
+// TODO, we should handle FP, MMX and the x87 control-word (for x86 and x86_64)
+
+#if SIMGRID_PROCESSOR_x86_64
 __asm__ (
 #if defined(__APPLE__)
    ".text\n"
@@ -203,7 +186,7 @@ __asm__ (
    "   pop %rdi\n"
    "   ret\n"
 );
-#elif PROCESSOR_i686
+#elif SIMGRID_PROCESSOR_i686
 __asm__ (
 #if defined(__APPLE__) || defined(_WIN32)
    ".text\n"
@@ -242,18 +225,24 @@ __asm__ (
    ".type raw_swapcontext,@function\n"
    "raw_swapcontext:\n"
 #endif
-   "   movl 4(%esp),%eax\n" /* old */
-   "   movl 8(%esp),%edx\n" /* new */
+   // Fetch the parameters:
+   "   movl 4(%esp),%eax\n" /* old (raw_stack_t*) */
+   "   movl 8(%esp),%edx\n" /* new (raw_stack_t)  */
+   // Save registers of the current context on the stack:
    "   pushl %ebp\n"
    "   pushl %ebx\n"
    "   pushl %esi\n"
    "   pushl %edi\n"
+   // Save the current context (stack pointer) in *old:
    "   movl %esp,(%eax)\n"
+   // Switch to the stack of the new context:
    "   movl %edx,%esp\n"
+   // Pop the values of the new context:
    "   popl %edi\n"
    "   popl %esi\n"
    "   popl %ebx\n"
    "   popl %ebp\n"
+   // Return using the return address of the new context:
    "   retl\n"
 );
 #else
@@ -281,12 +270,9 @@ namespace simix {
 RawContextFactory::RawContextFactory()
   : ContextFactory("RawContextFactory")
 {
-#ifdef ADAPTIVE_THRESHOLD
-  raw_context_adaptative = (SIMIX_context_get_parallel_threshold() > 1);
-#endif
   raw_context_parallel = SIMIX_context_is_parallel();
   if (raw_context_parallel) {
-#ifdef HAVE_THREAD_CONTEXTS
+#if HAVE_THREAD_CONTEXTS
     int nthreads = SIMIX_context_get_nthreads();
     xbt_os_thread_key_create(&raw_worker_id_key);
     // TODO, lazily init
@@ -296,16 +282,11 @@ RawContextFactory::RawContextFactory()
 #endif
     // TODO, if(SIMIX_context_get_parallel_threshold() > 1) => choose dynamically
   }
-#ifdef ADAPTIVE_THRESHOLD
-  round_time = xbt_os_timer_new();
-  reached_seq_limit = 0;
-  reached_par_limit = 0;
-#endif
 }
 
 RawContextFactory::~RawContextFactory()
 {
-#ifdef HAVE_THREAD_CONTEXTS
+#if HAVE_THREAD_CONTEXTS
   if (raw_parmap)
     xbt_parmap_destroy(raw_parmap);
   xbt_free(raw_workers_context);
@@ -359,11 +340,6 @@ void RawContext::stop()
 
 void RawContextFactory::run_all()
 {
-#ifdef ADAPTIVE_THRESHOLD
-  if (raw_context_adaptative)
-    run_all_adaptative();
-  else
-#endif
   if (raw_context_parallel)
     run_all_parallel();
   else
@@ -380,7 +356,7 @@ void RawContextFactory::run_all_serial()
 
 void RawContextFactory::run_all_parallel()
 {
-#ifdef HAVE_THREAD_CONTEXTS
+#if HAVE_THREAD_CONTEXTS
   raw_threads_working = 0;
   if (raw_parmap == nullptr)
     raw_parmap = xbt_parmap_new(
@@ -428,7 +404,7 @@ void RawContext::suspend_serial()
 
 void RawContext::suspend_parallel()
 {
-#ifdef HAVE_THREAD_CONTEXTS
+#if HAVE_THREAD_CONTEXTS
   /* determine the next context */
   smx_process_t next_work = (smx_process_t) xbt_parmap_next(raw_parmap);
   RawContext* next_context = nullptr;
@@ -469,7 +445,7 @@ void RawContext::resume_serial()
 
 void RawContext::resume_parallel()
 {
-#ifdef HAVE_THREAD_CONTEXTS
+#if HAVE_THREAD_CONTEXTS
   uintptr_t worker_id = __sync_fetch_and_add(&raw_threads_working, 1);
   xbt_os_thread_set_specific(raw_worker_id_key, (void*) worker_id);
   RawContext* worker_context = (RawContext*) SIMIX_context_self();
@@ -482,88 +458,7 @@ void RawContext::resume_parallel()
 #endif
 }
 
-/**
- * \brief Resumes all processes ready to run.
- */
-#ifdef ADAPTIVE_THRESHOLD
-void RawContectFactory::run_all_adaptative()
-{
-  unsigned long nb_processes = xbt_dynar_length(simix_global->process_to_run);
-  unsigned long threshold = SIMIX_context_get_parallel_threshold();
-  reached_seq_limit = (seq_sched_round % SCHED_ROUND_LIMIT == 0);
-  reached_par_limit = (par_sched_round % SCHED_ROUND_LIMIT == 0);
-
-  if(reached_seq_limit && reached_par_limit){
-    par_ratio = (par_proc_that_ran != 0) ? (par_time / (double)par_proc_that_ran) : 0;
-    seq_ratio = (seq_proc_that_ran != 0) ? (seq_time / (double)seq_proc_that_ran) : 0;
-    if(seq_ratio > par_ratio){
-       if(nb_processes < avg_par_proc) {
-          threshold = (threshold>2) ? threshold - 1 : threshold ;
-          SIMIX_context_set_parallel_threshold(threshold);
-        }
-    } else {
-        if(nb_processes > avg_seq_proc){
-          SIMIX_context_set_parallel_threshold(threshold+1);
-        }
-    }
-  }
-
-  if (nb_processes >= SIMIX_context_get_parallel_threshold()) {
-    simix_global->context_factory->suspend = smx_ctx_raw_suspend_parallel;
-    if (nb_processes < par_window){
-      par_sched_round++;
-      xbt_os_walltimer_start(round_time);
-      smx_ctx_raw_runall_parallel();
-      xbt_os_walltimer_stop(round_time);
-      par_time += xbt_os_timer_elapsed(round_time);
-
-      prev_avg_par_proc = avg_par_proc;
-      delta = nb_processes - avg_par_proc;
-      avg_par_proc = (par_sched_round==1) ? nb_processes : avg_par_proc + delta / (double) par_sched_round;
-
-      if(par_sched_round>=2){
-        s_par_proc = s_par_proc + (nb_processes - prev_avg_par_proc) * delta;
-        sd_par_proc = sqrt(s_par_proc / (par_sched_round-1));
-        par_window = (int) (avg_par_proc + sd_par_proc);
-      }else{
-        sd_par_proc = 0;
-      }
-
-      par_proc_that_ran += nb_processes;
-    } else{
-      smx_ctx_raw_runall_parallel();
-    }
-  } else {
-    simix_global->context_factory->suspend = smx_ctx_raw_suspend_serial;
-    if(nb_processes > seq_window){
-      seq_sched_round++;
-      xbt_os_walltimer_start(round_time);
-      smx_ctx_raw_runall_serial();
-      xbt_os_walltimer_stop(round_time);
-      seq_time += xbt_os_timer_elapsed(round_time);
-
-      prev_avg_seq_proc = avg_seq_proc;
-      delta = (nb_processes-avg_seq_proc);
-      avg_seq_proc = (seq_sched_round==1) ? nb_processes : avg_seq_proc + delta / (double) seq_sched_round;
-
-      if(seq_sched_round>=2){
-        s_seq_proc = s_seq_proc + (nb_processes - prev_avg_seq_proc)*delta;
-        sd_seq_proc = sqrt(s_seq_proc / (seq_sched_round-1));
-        seq_window = (int) (avg_seq_proc - sd_seq_proc);
-      } else {
-        sd_seq_proc = 0;
-      }
-
-      seq_proc_that_ran += nb_processes;
-    } else {
-      smx_ctx_raw_runall_serial();
-    }
-  }
-}
-
-#else
-
-// TODO
+/** @brief Resumes all processes ready to run. */
 void RawContextFactory::run_all_adaptative()
 {
   unsigned long nb_processes = xbt_dynar_length(simix_global->process_to_run);
@@ -578,7 +473,6 @@ void RawContextFactory::run_all_adaptative()
         this->run_all_serial();
     }
 }
-#endif
 
 }
 }