コード例 #1
0
ファイル: AsDijkstra.cpp プロジェクト: fabienchaix/simgrid
void AsDijkstra::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat)
{
  getRouteCheckParams(src, dst);
  int src_id = src->id();
  int dst_id = dst->id();

  int *pred_arr = nullptr;
  sg_platf_route_cbarg_t e_route;
  int size = 0;
  xbt_dynar_t nodes = xbt_graph_get_nodes(routeGraph_);

  /* Use the graph_node id mapping set to quickly find the nodes */
  graph_node_map_element_t src_elm = nodeMapSearch(src_id);
  graph_node_map_element_t dst_elm = nodeMapSearch(dst_id);

  int src_node_id = ((graph_node_data_t) xbt_graph_node_get_data(src_elm->node))->graph_id;
  int dst_node_id = ((graph_node_data_t) xbt_graph_node_get_data(dst_elm->node))->graph_id;

  /* if the src and dst are the same */
  if (src_node_id == dst_node_id) {

    xbt_node_t node_s_v = xbt_dynar_get_as(nodes, src_node_id, xbt_node_t);
    xbt_node_t node_e_v = xbt_dynar_get_as(nodes, dst_node_id, xbt_node_t);
    xbt_edge_t edge = xbt_graph_get_edge(routeGraph_, node_s_v, node_e_v);

    if (edge == nullptr)
      THROWF(arg_error, 0, "No route from '%s' to '%s'", src->name(), dst->name());

    e_route = (sg_platf_route_cbarg_t) xbt_graph_edge_get_data(edge);

    for (auto link: *e_route->link_list) {
      route->link_list->insert(route->link_list->begin(), link);
      if (lat)
        *lat += static_cast<Link*>(link)->getLatency();
    }

  }

  route_cache_element_t elm = nullptr;
  if (routeCache_) {  /* cache mode  */
    elm = (route_cache_element_t) xbt_dict_get_or_null_ext(routeCache_, (char *) (&src_id), sizeof(int));
  }

  if (elm) {                    /* cached mode and cache hit */
    pred_arr = elm->pred_arr;
  } else {                      /* not cached mode, or cache miss */

    int nr_nodes = xbt_dynar_length(nodes);
    double * cost_arr = xbt_new0(double, nr_nodes);      /* link cost from src to other hosts */
    pred_arr = xbt_new0(int, nr_nodes); /* predecessors in path from src */
    xbt_heap_t pqueue = xbt_heap_new(nr_nodes, xbt_free_f);

    /* initialize */
    cost_arr[src_node_id] = 0.0;

    for (int i = 0; i < nr_nodes; i++) {
      if (i != src_node_id) {
        cost_arr[i] = DBL_MAX;
      }

      pred_arr[i] = 0;

      /* initialize priority queue */
      int *nodeid = xbt_new0(int, 1);
      *nodeid = i;
      xbt_heap_push(pqueue, nodeid, cost_arr[i]);

    }

    /* apply dijkstra using the indexes from the graph's node array */
    while (xbt_heap_size(pqueue) > 0) {
      int *v_id = (int *) xbt_heap_pop(pqueue);
      xbt_node_t v_node = xbt_dynar_get_as(nodes, *v_id, xbt_node_t);
      xbt_edge_t edge = nullptr;
      unsigned int cursor;

      xbt_dynar_foreach(xbt_graph_node_get_outedges(v_node), cursor, edge) {
        xbt_node_t u_node = xbt_graph_edge_get_target(edge);
        graph_node_data_t data = (graph_node_data_t) xbt_graph_node_get_data(u_node);
        int u_id = data->graph_id;
        sg_platf_route_cbarg_t tmp_e_route = (sg_platf_route_cbarg_t) xbt_graph_edge_get_data(edge);
        int cost_v_u = tmp_e_route->link_list->size();    /* count of links, old model assume 1 */

        if (cost_v_u + cost_arr[*v_id] < cost_arr[u_id]) {
          pred_arr[u_id] = *v_id;
          cost_arr[u_id] = cost_v_u + cost_arr[*v_id];
          int *nodeid = xbt_new0(int, 1);
          *nodeid = u_id;
          xbt_heap_push(pqueue, nodeid, cost_arr[u_id]);
        }
      }

      /* free item popped from pqueue */
      xbt_free(v_id);
    }
コード例 #2
0
ファイル: xbt_strbuff.c プロジェクト: Shurakai/SimGrid
/** @brief Replaces a set of variables by their values
 *
 * @param b buffer to modify
 * @param patterns variables to substitute in the buffer
 *
 * Both '$toto' and '${toto}' are valid (and the two writing are equivalent).
 *
 * If the variable name contains spaces, use the brace version (ie, ${toto tutu})
 *
 * You can provide a default value to use if the variable is not set in the dict by using
 * '${var:=default}' or '${var:-default}'. These two forms are equivalent, even if they
 * shouldn't to respect the shell standard (:= form should set the value in the dict,
 * but does not) (BUG).
 */
void xbt_strbuff_varsubst(xbt_strbuff_t b, xbt_dict_t patterns)
{

  char *end;                    /* pointers around the parsed chunk */
  int in_simple_quote = 0, in_double_quote = 0;
  int done = 0;

  if (b->data[0] == '\0')
    return;
  end = b->data;

  while (!done) {
    switch (*end) {
    case '\\':
      /* Protected char; pass the protection */
      end++;
      if (*end == '\0')
        THROWF(arg_error, 0, "String ends with \\");
      break;

    case '\'':
      if (!in_double_quote) {
        /* simple quote not protected by double ones, note it */
        in_simple_quote = !in_simple_quote;
      }
      break;
    case '"':
      if (!in_simple_quote) {
        /* double quote protected by simple ones, note it */
        in_double_quote = !in_double_quote;
      }
      break;

    case '$':
      if (!in_simple_quote) {
        /* Go for the substitution. First search the variable name */
        char *beg_var, *end_var;        /* variable name boundary */
        char *beg_subst, *end_subst = NULL;     /* where value should be written to */
        char *value, *default_value = NULL;
        int val_len;
        beg_subst = end;


        if (*(++end) == '{') {
          /* the variable name is enclosed in braces. */
          beg_var = end + 1;
          /* Search name's end */
          end_var = beg_var;
          while (*end_var != '\0' && *end_var != '}') {
            /* TODO: we do not respect the standard for ":=", we should set this value in the dict */
            if (*end_var == ':'
                && ((*(end_var + 1) == '=') || (*(end_var + 1) == '-'))) {
              /* damn, we have a default value */
              char *p = end_var + 1;
              while (*p != '\0' && *p != '}')
                p++;
              if (*p == '\0')
                THROWF(arg_error, 0,
                       "Variable default value not terminated ('}' missing)");

              default_value = xbt_malloc(p - end_var - 1);
              memcpy(default_value, end_var + 2, p - end_var - 2);
              default_value[p - end_var - 2] = '\0';

              end_subst = p + 1;        /* eat '}' */

              break;
            }
            end_var++;
          }
          if (*end_var == '\0')
            THROWF(arg_error, 0,
                   "Variable name not terminated ('}' missing)");

          if (!end_subst)       /* already set if there's a default value */
            end_subst = end_var + 1;    /* also kill the } in the name */

          if (end_var == beg_var)
            THROWF(arg_error, 0, "Variable name empty (${} is not valid)");


        } else {
          /* name given directly */
          beg_var = end;
          end_var = beg_var;
          while (*end_var != '\0' && *end_var != ' ' && *end_var != '\t'
                 && *end_var != '\n')
            end_var++;
          end_subst = end_var;
          if (end_var == beg_var)
            THROWF(arg_error, 0, "Variable name empty ($ is not valid)");
        }
/*        XBT_DEBUG("var='%.*s'; subst='%.*s'; End_var = '%s'",
            end_var-beg_var,beg_var,
            end_subst-beg_subst,beg_subst,
            end_var);*/

        /* ok, we now have the variable name. Search the dictionary for the substituted value */
        value =
            xbt_dict_get_or_null_ext(patterns, beg_var, end_var - beg_var);
/*        XBT_DEBUG("Deal with '%s'",b->data);
        XBT_DEBUG("Search for %.*s, found %s (default value = %s)\n",
            end_var-beg_var,beg_var,
            (value?value:"(no value)"),
            (default_value?default_value:"(no value)"));*/

        if (value)
          value = xbt_strdup(value);
        else if (default_value)
          value = xbt_strdup(default_value);
        else
          value = xbt_strdup("");

        /* En route for the actual substitution */
        val_len = strlen(value);
//        XBT_DEBUG("val_len = %d, key_len=%d",val_len,end_subst-beg_subst);
        if (val_len <= end_subst - beg_subst) {
          /* enough room to do the substitute in place */
//          XBT_DEBUG("Substitute key name by its value: ie '%.*s' by '%.*s'",end_subst-beg_subst,beg_subst,val_len,value);
          memmove(beg_subst, value, val_len);   /* substitute */
//          XBT_DEBUG("String is now: '%s'",b->data);
/*          XBT_DEBUG("Move end of string closer (%d chars moved) :\n-'%.*s%.*s'\n+'%.*s%s'",
              b->used - (end_subst - b->data) + 1,
              beg_subst-b->data,b->data,
              b->used-(end_subst-b->data)+1,beg_subst+val_len,
              beg_subst-b->data,b->data,
              end_subst);*/
          memmove(beg_subst + val_len, end_subst, b->used - (end_subst - b->data) + 1); /* move the end of the string closer */
//          XBT_DEBUG("String is now: '%s'",b->data);
          end = beg_subst + val_len;    /* update the currently explored char in the overall loop */
//          XBT_DEBUG("end of substituted section is now '%s'",end);
          b->used -= end_subst - beg_subst - val_len;   /* update string buffer used size */
//          XBT_DEBUG("Used:%d end:%d ending char:%d",b->used,end-b->data,*end);
        } else {
          /* we have to extend the data area */
          int tooshort =
              val_len - (end_subst - beg_subst) + 1 /*don't forget \0 */ ;
          int newused = b->used + tooshort;
          end += tooshort;      /* update the pointer of the overall loop */
//          XBT_DEBUG("Too short (by %d chars; %d chars left in area)",val_len- (end_subst-beg_subst), b->size - b->used);
          if (newused > b->size) {
            /* We have to realloc the data area before (because b->size is too small). We have to update our pointers, too */
            char *newdata = realloc(b->data,
                                    b->used + MAX(minimal_increment,
                                                  tooshort));
            int offset = newdata - b->data;
            b->data = newdata;
            b->size = b->used + MAX(minimal_increment, tooshort);
            end += offset;
            beg_subst += offset;
            end_subst += offset;
          }
          memmove(beg_subst + val_len, end_subst, b->used - (end_subst - b->data) + 1); /* move the end of the string a bit further */
          memmove(beg_subst, value, val_len);   /* substitute */
          b->used = newused;
//          XBT_DEBUG("String is now: %s",b->data);
        }
        free(value);

        free(default_value);

        end--;                  /* compensate the next end++ */
      }
      break;

    case '\0':
      done = 1;
    }
    end++;
  }
}
コード例 #3
0
ファイル: xbt_str.c プロジェクト: apargupta/simgrid
/** @brief Just like @ref xbt_str_split_quoted (Splits a string into a dynar of strings), but without memory allocation
 *
 * The string passed as argument must be writable (not const)
 * The elements of the dynar are just parts of the string passed as argument.
 * So if you don't store that argument elsewhere, you should free it in addition
 * to freeing the dynar. This can be done by simply freeing the first argument
 * of the dynar:
 *  free(xbt_dynar_get_ptr(dynar,0));
 *
 * Actually this function puts a bunch of \0 in the memory area you passed as
 * argument to separate the elements, and pushes the address of each chunk
 * in the resulting dynar. Yes, that's uneven. Yes, that's gory. But that's efficient.
 */
xbt_dynar_t xbt_str_split_quoted_in_place(char *s) {
  xbt_dynar_t res = xbt_dynar_new(sizeof(char *), NULL);
  char *beg, *end;              /* pointers around the parsed chunk */
  int in_simple_quote = 0, in_double_quote = 0;
  int done = 0;
  int ctn = 0;                  /* Got something in this block */

  if (s[0] == '\0')
    return res;

  beg = s;

  /* do not trim leading spaces: caller responsibility to clean his cruft */
  end = beg;

  while (!done) {


    switch (*end) {
    case '\\':
      ctn = 1;
      /* Protected char; move it closer */
      memmove(end, end + 1, strlen(end));
      if (*end == '\0')
        THROWF(arg_error, 0, "String ends with \\");
      end++;                    /* Pass the protected char */
      break;

    case '\'':
      ctn = 1;
      if (!in_double_quote) {
        in_simple_quote = !in_simple_quote;
        memmove(end, end + 1, strlen(end));
      } else {
        /* simple quote protected by double ones */
        end++;
      }
      break;
    case '"':
      ctn = 1;
      if (!in_simple_quote) {
        in_double_quote = !in_double_quote;
        memmove(end, end + 1, strlen(end));
      } else {
        /* double quote protected by simple ones */
        end++;
      }
      break;

    case ' ':
    case '\t':
    case '\n':
    case '\0':
      if (*end == '\0' && (in_simple_quote || in_double_quote)) {
        THROWF(arg_error, 0,
               "End of string found while searching for %c in %s",
               (in_simple_quote ? '\'' : '"'), s);
      }
      if (in_simple_quote || in_double_quote) {
        end++;
      } else {
        if (*end == '\0')
          done = 1;

        *end = '\0';
        if (ctn) {
          /* Found a separator. Push the string if contains something */
          xbt_dynar_push(res, &beg);
        }
        ctn = 0;

        if (done)
          break;

        beg = ++end;
        /* trim within the string, manually to speed things up */
        while (*beg == ' ')
          beg++;
        end = beg;
      }
      break;

    default:
      ctn = 1;
      end++;
    }
  }
  return res;
}
コード例 #4
0
/**
 * @brief (in kernel mode) unpack the simcall and activate the handler
 * 
 * This function is generated from src/simix/simcalls.in
 */
void SIMIX_simcall_handle(smx_simcall_t simcall, int value) {
  XBT_DEBUG("Handling simcall %p: %s", simcall, SIMIX_simcall_name(simcall->call));
  SIMCALL_SET_MC_VALUE(simcall, value);
  if (simcall->issuer->context->iwannadie && simcall->call != SIMCALL_PROCESS_CLEANUP)
    return;
  switch (simcall->call) {
case SIMCALL_VM_SUSPEND:
       simcall_HANDLER_vm_suspend(simcall , (sg_host_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_VM_RESUME:
       simcall_HANDLER_vm_resume(simcall , (sg_host_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_VM_SHUTDOWN:
       simcall_HANDLER_vm_shutdown(simcall , (sg_host_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_VM_SAVE:
       simcall_HANDLER_vm_save(simcall , (sg_host_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_VM_RESTORE:
       simcall_HANDLER_vm_restore(simcall , (sg_host_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_CREATE:
      simcall->result.dp = simcall_HANDLER_process_create(simcall ,  simcall->args[0].cc, (xbt_main_func_t) simcall->args[1].fp,  simcall->args[2].dp,  simcall->args[3].cc,  simcall->args[4].d,  simcall->args[5].i, (char**) simcall->args[6].dp, (xbt_dict_t) simcall->args[7].dp,  simcall->args[8].i);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_KILL:
       simcall_HANDLER_process_kill(simcall , (smx_process_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_KILLALL:
       simcall_HANDLER_process_killall(simcall ,  simcall->args[0].i);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_CLEANUP:
       SIMIX_process_cleanup((smx_process_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_SUSPEND:
       simcall_HANDLER_process_suspend(simcall , (smx_process_t) simcall->args[0].dp);
       break;  

case SIMCALL_PROCESS_RESUME:
       simcall_HANDLER_process_resume(simcall , (smx_process_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_SET_HOST:
       simcall_HANDLER_process_set_host(simcall , (smx_process_t) simcall->args[0].dp, (sg_host_t) simcall->args[1].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_IS_SUSPENDED:
      simcall->result.i = SIMIX_process_is_suspended((smx_process_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_JOIN:
       simcall_HANDLER_process_join(simcall , (smx_process_t) simcall->args[0].dp,  simcall->args[1].d);
       break;  

case SIMCALL_PROCESS_SLEEP:
       simcall_HANDLER_process_sleep(simcall ,  simcall->args[0].d);
       break;  

case SIMCALL_EXECUTION_START:
      simcall->result.dp = simcall_HANDLER_execution_start(simcall ,  simcall->args[0].cc,  simcall->args[1].d,  simcall->args[2].d,  simcall->args[3].d,  simcall->args[4].ul);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_PARALLEL_START:
      simcall->result.dp = SIMIX_execution_parallel_start( simcall->args[0].cc, simcall->args[1].i,(sg_host_t*) simcall->args[2].dp,(double*) simcall->args[3].dp,(double*) simcall->args[4].dp, simcall->args[5].d, simcall->args[6].d);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_DESTROY:
       SIMIX_execution_destroy((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_CANCEL:
       SIMIX_execution_cancel((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_GET_REMAINS:
      simcall->result.d = SIMIX_execution_get_remains((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_GET_STATE:
      simcall->result.i = SIMIX_execution_get_state((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_SET_PRIORITY:
       SIMIX_execution_set_priority((smx_synchro_t) simcall->args[0].dp, simcall->args[1].d);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_SET_BOUND:
       SIMIX_execution_set_bound((smx_synchro_t) simcall->args[0].dp, simcall->args[1].d);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_SET_AFFINITY:
       SIMIX_execution_set_affinity((smx_synchro_t) simcall->args[0].dp,(sg_host_t) simcall->args[1].dp, simcall->args[2].ul);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_EXECUTION_WAIT:
       simcall_HANDLER_execution_wait(simcall , (smx_synchro_t) simcall->args[0].dp);
       break;  

case SIMCALL_PROCESS_ON_EXIT:
       SIMIX_process_on_exit((smx_process_t) simcall->args[0].dp,(int_f_pvoid_pvoid_t) simcall->args[1].fp, simcall->args[2].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_AUTO_RESTART_SET:
       SIMIX_process_auto_restart_set((smx_process_t) simcall->args[0].dp, simcall->args[1].i);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_PROCESS_RESTART:
      simcall->result.dp = simcall_HANDLER_process_restart(simcall , (smx_process_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_RDV_CREATE:
      simcall->result.dp = SIMIX_rdv_create( simcall->args[0].cc);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_RDV_DESTROY:
       SIMIX_rdv_destroy((smx_mailbox_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_RDV_COMM_COUNT_BY_HOST:
      simcall->result.ui = SIMIX_rdv_comm_count_by_host((smx_mailbox_t) simcall->args[0].dp,(sg_host_t) simcall->args[1].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_RDV_GET_HEAD:
      simcall->result.dp = SIMIX_rdv_get_head((smx_mailbox_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_RDV_SET_RECEIVER:
       SIMIX_rdv_set_receiver((smx_mailbox_t) simcall->args[0].dp,(smx_process_t) simcall->args[1].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_RDV_GET_RECEIVER:
      simcall->result.dp = SIMIX_rdv_get_receiver((smx_mailbox_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_IPROBE:
      simcall->result.dp = simcall_HANDLER_comm_iprobe(simcall , (smx_mailbox_t) simcall->args[0].dp,  simcall->args[1].i,  simcall->args[2].i,  simcall->args[3].i, (simix_match_func_t) simcall->args[4].fp,  simcall->args[5].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_SEND:
       simcall_HANDLER_comm_send(simcall , (smx_process_t) simcall->args[0].dp, (smx_mailbox_t) simcall->args[1].dp,  simcall->args[2].d,  simcall->args[3].d,  simcall->args[4].dp,  simcall->args[5].sz, (simix_match_func_t) simcall->args[6].fp, (simix_copy_data_func_t) simcall->args[7].fp,  simcall->args[8].dp,  simcall->args[9].d);
       break;  

case SIMCALL_COMM_ISEND:
      simcall->result.dp = simcall_HANDLER_comm_isend(simcall , (smx_process_t) simcall->args[0].dp, (smx_mailbox_t) simcall->args[1].dp,  simcall->args[2].d,  simcall->args[3].d,  simcall->args[4].dp,  simcall->args[5].sz, (simix_match_func_t) simcall->args[6].fp, (simix_clean_func_t) simcall->args[7].fp, (simix_copy_data_func_t) simcall->args[8].fp,  simcall->args[9].dp,  simcall->args[10].i);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_RECV:
       simcall_HANDLER_comm_recv(simcall , (smx_process_t) simcall->args[0].dp, (smx_mailbox_t) simcall->args[1].dp,  simcall->args[2].dp, (size_t*) simcall->args[3].dp, (simix_match_func_t) simcall->args[4].fp, (simix_copy_data_func_t) simcall->args[5].fp,  simcall->args[6].dp,  simcall->args[7].d,  simcall->args[8].d);
       break;  

case SIMCALL_COMM_IRECV:
      simcall->result.dp = simcall_HANDLER_comm_irecv(simcall , (smx_process_t) simcall->args[0].dp, (smx_mailbox_t) simcall->args[1].dp,  simcall->args[2].dp, (size_t*) simcall->args[3].dp, (simix_match_func_t) simcall->args[4].fp, (simix_copy_data_func_t) simcall->args[5].fp,  simcall->args[6].dp,  simcall->args[7].d);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_CANCEL:
       SIMIX_comm_cancel((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_WAITANY:
       simcall_HANDLER_comm_waitany(simcall , (xbt_dynar_t) simcall->args[0].dp);
       break;  

case SIMCALL_COMM_WAIT:
       simcall_HANDLER_comm_wait(simcall , (smx_synchro_t) simcall->args[0].dp,  simcall->args[1].d);
       break;  

case SIMCALL_COMM_TEST:
       simcall_HANDLER_comm_test(simcall , (smx_synchro_t) simcall->args[0].dp);
       break;  

case SIMCALL_COMM_TESTANY:
       simcall_HANDLER_comm_testany(simcall , (xbt_dynar_t) simcall->args[0].dp);
       break;  

case SIMCALL_COMM_GET_REMAINS:
      simcall->result.d = SIMIX_comm_get_remains((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_GET_STATE:
      simcall->result.i = SIMIX_comm_get_state((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_GET_SRC_DATA:
      simcall->result.dp = SIMIX_comm_get_src_data((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_GET_DST_DATA:
      simcall->result.dp = SIMIX_comm_get_dst_data((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_GET_SRC_PROC:
      simcall->result.dp = SIMIX_comm_get_src_proc((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COMM_GET_DST_PROC:
      simcall->result.dp = SIMIX_comm_get_dst_proc((smx_synchro_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_MUTEX_INIT:
      simcall->result.dp = simcall_HANDLER_mutex_init(simcall );
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_MUTEX_LOCK:
       simcall_HANDLER_mutex_lock(simcall , (smx_mutex_t) simcall->args[0].dp);
       break;  

case SIMCALL_MUTEX_TRYLOCK:
      simcall->result.i = simcall_HANDLER_mutex_trylock(simcall , (smx_mutex_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_MUTEX_UNLOCK:
       simcall_HANDLER_mutex_unlock(simcall , (smx_mutex_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COND_INIT:
      simcall->result.dp = SIMIX_cond_init();
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COND_SIGNAL:
       SIMIX_cond_signal((smx_cond_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_COND_WAIT:
       simcall_HANDLER_cond_wait(simcall , (smx_cond_t) simcall->args[0].dp, (smx_mutex_t) simcall->args[1].dp);
       break;  

case SIMCALL_COND_WAIT_TIMEOUT:
       simcall_HANDLER_cond_wait_timeout(simcall , (smx_cond_t) simcall->args[0].dp, (smx_mutex_t) simcall->args[1].dp,  simcall->args[2].d);
       break;  

case SIMCALL_COND_BROADCAST:
       SIMIX_cond_broadcast((smx_cond_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_SEM_INIT:
      simcall->result.dp = SIMIX_sem_init( simcall->args[0].ui);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_SEM_RELEASE:
       simcall_HANDLER_sem_release(simcall , (smx_sem_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_SEM_WOULD_BLOCK:
      simcall->result.i = simcall_HANDLER_sem_would_block(simcall , (smx_sem_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_SEM_ACQUIRE:
       simcall_HANDLER_sem_acquire(simcall , (smx_sem_t) simcall->args[0].dp);
       break;  

case SIMCALL_SEM_ACQUIRE_TIMEOUT:
       simcall_HANDLER_sem_acquire_timeout(simcall , (smx_sem_t) simcall->args[0].dp,  simcall->args[1].d);
       break;  

case SIMCALL_SEM_GET_CAPACITY:
      simcall->result.i = simcall_HANDLER_sem_get_capacity(simcall , (smx_sem_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_FILE_READ:
       simcall_HANDLER_file_read(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].sgsz, (sg_host_t) simcall->args[2].dp);
       break;  

case SIMCALL_FILE_WRITE:
       simcall_HANDLER_file_write(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].sgsz, (sg_host_t) simcall->args[2].dp);
       break;  

case SIMCALL_FILE_OPEN:
       simcall_HANDLER_file_open(simcall ,  simcall->args[0].cc, (sg_host_t) simcall->args[1].dp);
       break;  

case SIMCALL_FILE_CLOSE:
       simcall_HANDLER_file_close(simcall , (smx_file_t) simcall->args[0].dp, (sg_host_t) simcall->args[1].dp);
       break;  

case SIMCALL_FILE_UNLINK:
      simcall->result.i = SIMIX_file_unlink((smx_file_t) simcall->args[0].dp,(sg_host_t) simcall->args[1].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_FILE_GET_SIZE:
      simcall->result.sgsz = simcall_HANDLER_file_get_size(simcall , (smx_file_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_FILE_TELL:
      simcall->result.sgsz = simcall_HANDLER_file_tell(simcall , (smx_file_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_FILE_SEEK:
      simcall->result.i = simcall_HANDLER_file_seek(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].sgoff,  simcall->args[2].i);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_FILE_GET_INFO:
      simcall->result.dp = simcall_HANDLER_file_get_info(simcall , (smx_file_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_FILE_MOVE:
      simcall->result.i = simcall_HANDLER_file_move(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].cc);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_STORAGE_GET_FREE_SIZE:
      simcall->result.sgsz = simcall_HANDLER_storage_get_free_size(simcall , (smx_storage_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_STORAGE_GET_USED_SIZE:
      simcall->result.sgsz = simcall_HANDLER_storage_get_used_size(simcall , (smx_storage_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_STORAGE_GET_PROPERTIES:
      simcall->result.dp = SIMIX_storage_get_properties((smx_storage_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_STORAGE_GET_CONTENT:
      simcall->result.dp = SIMIX_storage_get_content((smx_storage_t) simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_ASR_GET_PROPERTIES:
      simcall->result.dp = simcall_HANDLER_asr_get_properties(simcall ,  simcall->args[0].cc);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_MC_RANDOM:
      simcall->result.i = simcall_HANDLER_mc_random(simcall ,  simcall->args[0].i,  simcall->args[1].i);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_SET_CATEGORY:
       SIMIX_set_category((smx_synchro_t) simcall->args[0].dp, simcall->args[1].cc);
      SIMIX_simcall_answer(simcall);
      break;  

case SIMCALL_RUN_KERNEL:
       SIMIX_run_kernel( simcall->args[0].dp);
      SIMIX_simcall_answer(simcall);
      break;  
    case NUM_SIMCALLS:
      break;
    case SIMCALL_NONE:
      THROWF(arg_error,0,"Asked to do the noop syscall on %s@%s",
          SIMIX_process_get_name(simcall->issuer),
          sg_host_get_name(SIMIX_process_get_host(simcall->issuer))
          );
      break;

  }
}
コード例 #5
0
int smpi_coll_tuned_allgather_mvapich2_smp(void *sendbuf,int sendcnt, MPI_Datatype sendtype,
                            void *recvbuf, int recvcnt,MPI_Datatype recvtype,
                            MPI_Comm  comm)
{
    int rank, size;
    int local_rank, local_size;
    int leader_comm_size = 0; 
    int mpi_errno = MPI_SUCCESS;
    MPI_Aint recvtype_extent = 0;  /* Datatype extent */
    MPI_Comm shmem_comm, leader_comm;

  if(smpi_comm_get_leaders_comm(comm)==MPI_COMM_NULL){
    smpi_comm_init_smp(comm);
  }
  
    if(!smpi_comm_is_uniform(comm) || !smpi_comm_is_blocked(comm))
    THROWF(arg_error,0, "allgather MVAPICH2 smp algorithm can't be used with irregular deployment. Please insure that processes deployed on the same node are contiguous and that each node has the same number of processes");
  
    if (recvcnt == 0) {
        return MPI_SUCCESS;
    }

    rank = smpi_comm_rank(comm);
    size = smpi_comm_size(comm);

    /* extract the rank,size information for the intra-node communicator */
    recvtype_extent=smpi_datatype_get_extent(recvtype);
    
    shmem_comm = smpi_comm_get_intra_comm(comm);
    local_rank = smpi_comm_rank(shmem_comm);
    local_size = smpi_comm_size(shmem_comm);

    if (local_rank == 0) {
        /* Node leader. Extract the rank, size information for the leader communicator */
        leader_comm = smpi_comm_get_leaders_comm(comm);
        if(leader_comm==MPI_COMM_NULL){
          leader_comm = MPI_COMM_WORLD;
        }
        leader_comm_size = smpi_comm_size(leader_comm);
    }

    /*If there is just one node, after gather itself,
     * root has all the data and it can do bcast*/
    if(local_rank == 0) {
        mpi_errno = mpi_coll_gather_fun(sendbuf, sendcnt,sendtype, 
                                    (void*)((char*)recvbuf + (rank * recvcnt * recvtype_extent)), 
                                     recvcnt, recvtype,
                                     0, shmem_comm);
    } else {
        /*Since in allgather all the processes could have 
         * its own data in place*/
        if(sendbuf == MPI_IN_PLACE) {
            mpi_errno = mpi_coll_gather_fun((void*)((char*)recvbuf + (rank * recvcnt * recvtype_extent)), 
                                         recvcnt , recvtype, 
                                         recvbuf, recvcnt, recvtype,
                                         0, shmem_comm);
        } else {
            mpi_errno = mpi_coll_gather_fun(sendbuf, sendcnt,sendtype, 
                                         recvbuf, recvcnt, recvtype,
                                         0, shmem_comm);
        }
    }
    /* Exchange the data between the node leaders*/
    if (local_rank == 0 && (leader_comm_size > 1)) {
        /*When data in each socket is different*/
        if (smpi_comm_is_uniform(comm) != 1) {

            int *displs = NULL;
            int *recvcnts = NULL;
            int *node_sizes = NULL;
            int i = 0;

            node_sizes = smpi_comm_get_non_uniform_map(comm);

            displs = xbt_malloc(sizeof (int) * leader_comm_size);
            recvcnts = xbt_malloc(sizeof (int) * leader_comm_size);
            if (!displs || !recvcnts) {
                return MPI_ERR_OTHER;
            }
            recvcnts[0] = node_sizes[0] * recvcnt;
            displs[0] = 0;

            for (i = 1; i < leader_comm_size; i++) {
                displs[i] = displs[i - 1] + node_sizes[i - 1] * recvcnt;
                recvcnts[i] = node_sizes[i] * recvcnt;
            }


            void* sendbuf=((char*)recvbuf)+smpi_datatype_get_extent(recvtype)*displs[smpi_comm_rank(leader_comm)];

            mpi_errno = mpi_coll_allgatherv_fun(sendbuf,
                                       (recvcnt*local_size),
                                       recvtype, 
                                       recvbuf, recvcnts,
                                       displs, recvtype,
                                       leader_comm);
            xbt_free(displs);
            xbt_free(recvcnts);
        } else {
        void* sendtmpbuf=((char*)recvbuf)+smpi_datatype_get_extent(recvtype)*(recvcnt*local_size)*smpi_comm_rank(leader_comm);
        
          

            mpi_errno = smpi_coll_tuned_allgather_mpich(sendtmpbuf, 
                                               (recvcnt*local_size),
                                               recvtype,
                                               recvbuf, (recvcnt*local_size), recvtype,
                                             leader_comm);

        }
    }

    /*Bcast the entire data from node leaders to all other cores*/
    mpi_errno = mpi_coll_bcast_fun (recvbuf, recvcnt * size, recvtype, 0, shmem_comm);
    return mpi_errno;
}
コード例 #6
0
ファイル: smx_smurf.c プロジェクト: sbadia/simgrid
void SIMIX_request_pre(smx_req_t req, int value)
{

  switch (req->call) {
    case REQ_COMM_TEST:
      SIMIX_pre_comm_test(req);
      break;

    case REQ_COMM_TESTANY:
      SIMIX_pre_comm_testany(req, value);
      break;

    case REQ_COMM_WAIT:
      SIMIX_pre_comm_wait(req,
          req->comm_wait.comm,
          req->comm_wait.timeout,
          value);
      break;

    case REQ_COMM_WAITANY:
      SIMIX_pre_comm_waitany(req, value);
      break;

    case REQ_COMM_SEND:
    {
      smx_action_t comm = SIMIX_comm_isend(
          req->issuer,
          req->comm_send.rdv,
          req->comm_send.task_size,
          req->comm_send.rate,
          req->comm_send.src_buff,
          req->comm_send.src_buff_size,
          req->comm_send.match_fun,
          req->comm_send.data,
          0);
      SIMIX_pre_comm_wait(req, comm, req->comm_send.timeout, 0);
      break;
    }

    case REQ_COMM_ISEND:
      req->comm_isend.result = SIMIX_comm_isend(
          req->issuer,
          req->comm_isend.rdv,
          req->comm_isend.task_size,
          req->comm_isend.rate,
          req->comm_isend.src_buff,
          req->comm_isend.src_buff_size,
          req->comm_isend.match_fun,
          req->comm_isend.data,
          req->comm_isend.detached);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_RECV:
    {
      smx_action_t comm = SIMIX_comm_irecv(
          req->issuer,
          req->comm_recv.rdv,
          req->comm_recv.dst_buff,
          req->comm_recv.dst_buff_size,
          req->comm_recv.match_fun,
          req->comm_recv.data);
      SIMIX_pre_comm_wait(req, comm, req->comm_recv.timeout, 0);
      break;
    }

    case REQ_COMM_IRECV:
      req->comm_irecv.result = SIMIX_comm_irecv(
          req->issuer,
          req->comm_irecv.rdv,
          req->comm_irecv.dst_buff,
          req->comm_irecv.dst_buff_size,
          req->comm_irecv.match_fun,
          req->comm_irecv.data);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_DESTROY:
      SIMIX_comm_destroy(req->comm_destroy.comm);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_CANCEL:
      SIMIX_comm_cancel(req->comm_cancel.comm);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_GET_REMAINS:
      req->comm_get_remains.result =
          SIMIX_comm_get_remains(req->comm_get_remains.comm);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_GET_STATE:
      req->comm_get_state.result =
          SIMIX_comm_get_state(req->comm_get_state.comm);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_GET_SRC_DATA:
      req->comm_get_src_data.result = SIMIX_comm_get_src_data(req->comm_get_src_data.comm);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_GET_DST_DATA:
      req->comm_get_dst_data.result = SIMIX_comm_get_dst_data(req->comm_get_dst_data.comm);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_GET_SRC_PROC:
      req->comm_get_src_proc.result =
          SIMIX_comm_get_src_proc(req->comm_get_src_proc.comm);
      SIMIX_request_answer(req);
      break;

    case REQ_COMM_GET_DST_PROC:
      req->comm_get_dst_proc.result =
          SIMIX_comm_get_dst_proc(req->comm_get_dst_proc.comm);
      SIMIX_request_answer(req);
      break;

#ifdef HAVE_LATENCY_BOUND_TRACKING
    case REQ_COMM_IS_LATENCY_BOUNDED:
      req->comm_is_latency_bounded.result =
          SIMIX_comm_is_latency_bounded(req->comm_is_latency_bounded.comm);
      SIMIX_request_answer(req);
      break;
#endif

    case REQ_RDV_CREATE:
      req->rdv_create.result = SIMIX_rdv_create(req->rdv_create.name);
      SIMIX_request_answer(req);
      break;

    case REQ_RDV_DESTROY:
      SIMIX_rdv_destroy(req->rdv_destroy.rdv);
      SIMIX_request_answer(req);
      break;

    case REQ_RDV_GEY_BY_NAME:
      req->rdv_get_by_name.result =
        SIMIX_rdv_get_by_name(req->rdv_get_by_name.name);
      SIMIX_request_answer(req);
      break;

    case REQ_RDV_COMM_COUNT_BY_HOST:
      req->rdv_comm_count_by_host.result = SIMIX_rdv_comm_count_by_host(
          req->rdv_comm_count_by_host.rdv,
          req->rdv_comm_count_by_host.host);
      SIMIX_request_answer(req);
      break;

    case REQ_RDV_GET_HEAD:
      req->rdv_get_head.result = SIMIX_rdv_get_head(req->rdv_get_head.rdv);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_GET_BY_NAME:
      req->host_get_by_name.result =
        SIMIX_host_get_by_name(req->host_get_by_name.name);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_GET_NAME:
      req->host_get_name.result =	SIMIX_host_get_name(req->host_get_name.host);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_GET_PROPERTIES:
      req->host_get_properties.result =
        SIMIX_host_get_properties(req->host_get_properties.host);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_GET_SPEED:
      req->host_get_speed.result = 
        SIMIX_host_get_speed(req->host_get_speed.host);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_GET_AVAILABLE_SPEED:
      req->host_get_available_speed.result =
      	SIMIX_host_get_available_speed(req->host_get_available_speed.host);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_GET_STATE:
      req->host_get_state.result = 
        SIMIX_host_get_state(req->host_get_state.host);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_GET_DATA:
      req->host_get_data.result =	SIMIX_host_get_data(req->host_get_data.host);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_SET_DATA:
      SIMIX_host_set_data(req->host_set_data.host, req->host_set_data.data);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_EXECUTE:
      req->host_execute.result = SIMIX_host_execute(
	  req->host_execute.name,
	  req->host_execute.host,
	  req->host_execute.computation_amount,
	  req->host_execute.priority);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_PARALLEL_EXECUTE:
      req->host_parallel_execute.result = SIMIX_host_parallel_execute(
	  req->host_parallel_execute.name,
	  req->host_parallel_execute.host_nb,
	  req->host_parallel_execute.host_list,
	  req->host_parallel_execute.computation_amount,
	  req->host_parallel_execute.communication_amount,
	  req->host_parallel_execute.amount,
	  req->host_parallel_execute.rate);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_EXECUTION_DESTROY:
      SIMIX_host_execution_destroy(req->host_execution_destroy.execution);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_EXECUTION_CANCEL:
      SIMIX_host_execution_cancel(req->host_execution_cancel.execution);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_EXECUTION_GET_REMAINS:
      req->host_execution_get_remains.result =
        SIMIX_host_execution_get_remains(req->host_execution_get_remains.execution);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_EXECUTION_GET_STATE:
      req->host_execution_get_state.result =
      	SIMIX_host_execution_get_state(req->host_execution_get_state.execution);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_EXECUTION_SET_PRIORITY:
      SIMIX_host_execution_set_priority(
	  req->host_execution_set_priority.execution,
	  req->host_execution_set_priority.priority);
      SIMIX_request_answer(req);
      break;

    case REQ_HOST_EXECUTION_WAIT:
      SIMIX_pre_host_execution_wait(req);
      break;

    case REQ_PROCESS_CREATE:
      SIMIX_process_create(
          req->process_create.process,
	  req->process_create.name,
	  req->process_create.code,
	  req->process_create.data,
	  req->process_create.hostname,
	  req->process_create.argc,
	  req->process_create.argv,
	  req->process_create.properties);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_KILL:
      SIMIX_process_kill(req->process_kill.process);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_KILLALL:
      SIMIX_process_killall(req->issuer);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_CLEANUP:
      SIMIX_process_cleanup(req->process_cleanup.process);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_CHANGE_HOST:
      SIMIX_process_change_host(
	  req->process_change_host.process,
	  req->process_change_host.source,
	  req->process_change_host.dest);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_SUSPEND:
      SIMIX_pre_process_suspend(req);
      break;

    case REQ_PROCESS_RESUME:
      SIMIX_process_resume(req->process_resume.process, req->issuer);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_COUNT:
      req->process_count.result = SIMIX_process_count();
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_GET_DATA:
      req->process_get_data.result =
        SIMIX_process_get_data(req->process_get_data.process);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_SET_DATA:
      SIMIX_process_set_data(
	  req->process_set_data.process,
	  req->process_set_data.data);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_GET_HOST:
      req->process_get_host.result = SIMIX_process_get_host(req->process_get_host.process);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_GET_NAME:
      req->process_get_name.result = SIMIX_process_get_name(req->process_get_name.process);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_IS_SUSPENDED:
      req->process_is_suspended.result =
        SIMIX_process_is_suspended(req->process_is_suspended.process);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_GET_PROPERTIES:
      req->process_get_properties.result =
        SIMIX_process_get_properties(req->process_get_properties.process);
      SIMIX_request_answer(req);
      break;

    case REQ_PROCESS_SLEEP:
      SIMIX_pre_process_sleep(req);
      break;

#ifdef HAVE_TRACING
    case REQ_SET_CATEGORY:
      SIMIX_set_category(
          req->set_category.action,
          req->set_category.category);
      SIMIX_request_answer(req);
      break;
#endif

    case REQ_MUTEX_INIT:
      req->mutex_init.result = SIMIX_mutex_init();
      SIMIX_request_answer(req);
      break;

    case REQ_MUTEX_DESTROY:
      SIMIX_mutex_destroy(req->mutex_destroy.mutex);
      SIMIX_request_answer(req);
      break;

    case REQ_MUTEX_LOCK:
      SIMIX_pre_mutex_lock(req);
      break;

    case REQ_MUTEX_TRYLOCK:
      req->mutex_trylock.result =
	      SIMIX_mutex_trylock(req->mutex_trylock.mutex, req->issuer);
      SIMIX_request_answer(req);
      break;

    case REQ_MUTEX_UNLOCK:
      SIMIX_mutex_unlock(req->mutex_unlock.mutex, req->issuer);
      SIMIX_request_answer(req);
      break;

    case REQ_COND_INIT:
      req->cond_init.result = SIMIX_cond_init();
      SIMIX_request_answer(req);
      break;

    case REQ_COND_DESTROY:
      SIMIX_cond_destroy(req->cond_destroy.cond);
      SIMIX_request_answer(req);
      break;

    case REQ_COND_SIGNAL:
      SIMIX_cond_signal(req->cond_signal.cond);
      SIMIX_request_answer(req);
      break;

    case REQ_COND_WAIT:
      SIMIX_pre_cond_wait(req);
      break;

    case REQ_COND_WAIT_TIMEOUT:
      SIMIX_pre_cond_wait_timeout(req);
      break;

    case REQ_COND_BROADCAST:
      SIMIX_cond_broadcast(req->cond_broadcast.cond);
      SIMIX_request_answer(req);
      break;

    case REQ_SEM_INIT:
      req->sem_init.result = SIMIX_sem_init(req->sem_init.capacity);
      SIMIX_request_answer(req);
      break;

    case REQ_SEM_DESTROY:
      SIMIX_sem_destroy(req->sem_destroy.sem);
      SIMIX_request_answer(req);
      break;

    case REQ_SEM_RELEASE:
      SIMIX_sem_release(req->sem_release.sem);
      SIMIX_request_answer(req);
      break;

    case REQ_SEM_WOULD_BLOCK:
      req->sem_would_block.result =
      	SIMIX_sem_would_block(req->sem_would_block.sem);
      SIMIX_request_answer(req);
      break;

    case REQ_SEM_ACQUIRE:
      SIMIX_pre_sem_acquire(req);
      break;

    case REQ_SEM_ACQUIRE_TIMEOUT:
      SIMIX_pre_sem_acquire_timeout(req);
      break;

    case REQ_SEM_GET_CAPACITY:
      req->sem_get_capacity.result = 
        SIMIX_sem_get_capacity(req->sem_get_capacity.sem);
      SIMIX_request_answer(req);
      break;

    case REQ_NO_REQ:
      THROWF(arg_error,0,"Asked to do the noop syscall on %s@%s",
          SIMIX_process_get_name(req->issuer),
          SIMIX_host_get_name(SIMIX_process_get_host(req->issuer))
          );
      break;
  }
}
コード例 #7
0
ファイル: allgather-SMP-NTS.cpp プロジェクト: simgrid/simgrid
int Coll_allgather_SMP_NTS::allgather(const void *sbuf, int scount,
                                      MPI_Datatype stype, void *rbuf,
                                      int rcount, MPI_Datatype rtype,
                                      MPI_Comm comm)
{
  int src, dst, comm_size, rank;
  comm_size = comm->size();
  rank = comm->rank();
  MPI_Aint rextent, sextent;
  rextent = rtype->get_extent();
  sextent = stype->get_extent();
  int tag = COLL_TAG_ALLGATHER;

  int i, send_offset, recv_offset;
  int intra_rank, inter_rank;

  if(comm->get_leaders_comm()==MPI_COMM_NULL){
    comm->init_smp();
  }
  int num_core=1;
  if (comm->is_uniform()){
    num_core = comm->get_intra_comm()->size();
  }


  intra_rank = rank % num_core;
  inter_rank = rank / num_core;
  int inter_comm_size = (comm_size + num_core - 1) / num_core;
  int num_core_in_current_smp = num_core;

  if(comm_size%num_core)
    THROWF(arg_error,0, "allgather SMP NTS algorithm can't be used with non multiple of NUM_CORE=%d number of processes ! ", num_core);

  /* for too small number of processes, use default implementation */
  if (comm_size <= num_core) {
    XBT_WARN("MPI_allgather_SMP_NTS use default MPI_allgather.");
    Coll_allgather_default::allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm);
    return MPI_SUCCESS;
  }

  // the last SMP node may have fewer number of running processes than all others
  if (inter_rank == (inter_comm_size - 1)) {
    num_core_in_current_smp = comm_size - (inter_rank * num_core);
  }
  //copy corresponding message from sbuf to rbuf
  recv_offset = rank * rextent * rcount;
  Request::sendrecv(sbuf, scount, stype, rank, tag,
               ((char *) rbuf + recv_offset), rcount, rtype, rank, tag, comm,
               MPI_STATUS_IGNORE);

  //gather to root of each SMP

  for (i = 1; i < num_core_in_current_smp; i++) {

    dst =
        (inter_rank * num_core) + (intra_rank + i) % (num_core_in_current_smp);
    src =
        (inter_rank * num_core) + (intra_rank - i +
                                   num_core_in_current_smp) %
        (num_core_in_current_smp);
    recv_offset = src * rextent * rcount;

    Request::sendrecv(sbuf, scount, stype, dst, tag,
                 ((char *) rbuf + recv_offset), rcount, rtype, src, tag, comm,
                 MPI_STATUS_IGNORE);

  }

  // INTER-SMP-ALLGATHER
  // Every root of each SMP node post INTER-Sendrecv, then do INTRA-Bcast for each receiving message
  // Use logical ring algorithm

  // root of each SMP
  if (intra_rank == 0) {
    MPI_Request* rrequest_array = new MPI_Request[inter_comm_size - 1];
    MPI_Request* srequest_array = new MPI_Request[inter_comm_size - 1];

    src = ((inter_rank - 1 + inter_comm_size) % inter_comm_size) * num_core;
    dst = ((inter_rank + 1) % inter_comm_size) * num_core;

    // post all inter Irecv
    for (i = 0; i < inter_comm_size - 1; i++) {
      recv_offset =
          ((inter_rank - i - 1 +
            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
      rrequest_array[i] = Request::irecv((char *)rbuf + recv_offset, rcount * num_core,
                                         rtype, src, tag + i, comm);
    }

    // send first message
    send_offset =
        ((inter_rank +
          inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
    srequest_array[0] = Request::isend((char *)rbuf + send_offset, scount * num_core,
                                       stype, dst, tag, comm);

    // loop : recv-inter , send-inter, send-intra (linear-bcast)
    for (i = 0; i < inter_comm_size - 2; i++) {
      recv_offset =
          ((inter_rank - i - 1 +
            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
      Request::wait(&rrequest_array[i], MPI_STATUS_IGNORE);
      srequest_array[i + 1] = Request::isend((char *)rbuf + recv_offset, scount * num_core,
                                             stype, dst, tag + i + 1, comm);
      if (num_core_in_current_smp > 1) {
        Request::send((char *)rbuf + recv_offset, scount * num_core,
                      stype, (rank + 1), tag + i + 1, comm);
      }
    }

    // recv last message and send_intra
    recv_offset =
        ((inter_rank - i - 1 +
          inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
    //recv_offset = ((inter_rank + 1) % inter_comm_size) * num_core * sextent * scount;
    //i=inter_comm_size-2;
    Request::wait(&rrequest_array[i], MPI_STATUS_IGNORE);
    if (num_core_in_current_smp > 1) {
      Request::send((char *)rbuf + recv_offset, scount * num_core,
                                  stype, (rank + 1), tag + i + 1, comm);
    }

    Request::waitall(inter_comm_size - 1, srequest_array, MPI_STATUSES_IGNORE);
    delete[] rrequest_array;
    delete[] srequest_array;
  }
  // last rank of each SMP
  else if (intra_rank == (num_core_in_current_smp - 1)) {
    for (i = 0; i < inter_comm_size - 1; i++) {
      recv_offset =
          ((inter_rank - i - 1 +
            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
      Request::recv((char *) rbuf + recv_offset, (rcount * num_core), rtype,
                    rank - 1, tag + i + 1, comm, MPI_STATUS_IGNORE);
    }
  }
  // intermediate rank of each SMP
  else {
    for (i = 0; i < inter_comm_size - 1; i++) {
      recv_offset =
          ((inter_rank - i - 1 +
            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
      Request::recv((char *) rbuf + recv_offset, (rcount * num_core), rtype,
                    rank - 1, tag + i + 1, comm, MPI_STATUS_IGNORE);
      Request::send((char *) rbuf + recv_offset, (scount * num_core), stype,
                    (rank + 1), tag + i + 1, comm);
    }
  }

  return MPI_SUCCESS;
}
コード例 #8
0
ファイル: dynar.c プロジェクト: Shurakai/SimGrid
static XBT_INLINE void _check_populated_dynar(xbt_dynar_t dynar)
{
  if (dynar->used == 0) {
    THROWF(bound_error, 0, "dynar %p is empty", dynar);
  }
}