Exemple #1
0
static bool reduce_end_bit(int bit)
{
  int rank = pcu_mpi_rank();
  if (rank==0)
    return bit >= pcu_mpi_size();
  return (bit>>1) & rank;
}
Exemple #2
0
static int bcast_action(int bit)
{
  if (bcast_peer(bit) >= pcu_mpi_size())
    return pcu_coll_idle;
  if (bit & pcu_mpi_rank())
    return pcu_coll_recv;
  return pcu_coll_send;
}
Exemple #3
0
static int reduce_action(int bit)
{
  if (reduce_peer(bit) >= pcu_mpi_size())
    return pcu_coll_idle;
  if (bit & pcu_mpi_rank())
    return pcu_coll_send;
  return pcu_coll_recv;
}
Exemple #4
0
static int bcast_begin_bit(void)
{
  int rank = pcu_mpi_rank();
  if (rank == 0)
    return 1 << pcu_ceil_log2(pcu_mpi_size());
  int bit = 1;
  while ( ! (bit & rank)) bit <<= 1;
  return bit;
}
Exemple #5
0
FILE* pcu_open_parallel(const char* prefix, const char* ext)
{
  //max_rank_chars = strlen("4294967296"), 4294967296 = 2^32 ~= INT_MAX
  static const size_t max_rank_chars = 10;
  size_t path_size = strlen(prefix) + max_rank_chars + strlen(ext) + 1;
  char* path = noto_malloc(path_size);
  int rank = pcu_mpi_rank();
  snprintf(path,path_size,"%s%d.%s",prefix,rank,ext);
  FILE* file = fopen(path, "w");
  noto_free(path);
  return file;
}
Exemple #6
0
static int scan_down_action(int bit)
{
  int rank = pcu_mpi_rank();
  if ((scan_down_could_send(rank,bit))&&
      (scan_down_receiver_for(rank,bit) < pcu_mpi_size()))
    return pcu_coll_send;
  int sender = scan_down_sender_for(rank,bit);
  if ((0 <= sender)&&
      (scan_down_could_send(sender,bit)))
    return pcu_coll_recv;
  return pcu_coll_idle;
}
Exemple #7
0
static int scan_up_action(int bit)
{
  int rank = pcu_mpi_rank();
  if ((scan_up_could_receive(rank,bit))&&
      (0 <= scan_up_sender_for(rank,bit)))
    return pcu_coll_recv;
  int receiver = scan_up_receiver_for(rank,bit);
  if ((receiver < pcu_mpi_size())&&
      (scan_up_could_receive(receiver,bit)))
    return pcu_coll_send;
  return pcu_coll_idle;
}
Exemple #8
0
static int scan_up_peer(int bit)
{
  int rank = pcu_mpi_rank();
  int sender = scan_up_sender_for(rank,bit);
  if ((scan_up_could_receive(rank,bit))&&
      (0 <= sender))
    return sender;
  int receiver = scan_up_receiver_for(rank,bit);
  if ((receiver < pcu_mpi_size())&&
      (scan_up_could_receive(receiver,bit)))
    return receiver;
  return -1;
}
Exemple #9
0
static int scan_down_peer(int bit)
{
  int rank = pcu_mpi_rank();
  if (scan_down_could_send(rank,bit))
  {
    int receiver = scan_down_receiver_for(rank,bit);
    if (receiver < pcu_mpi_size())
      return receiver;
  }
  int sender = scan_down_sender_for(rank,bit);
  if ((0 <= sender)&&
      (scan_down_could_send(sender,bit)))
    return sender;
  return -1;
}
Exemple #10
0
static int bcast_peer(int bit)
{
  return pcu_mpi_rank() ^ bit;
}
Exemple #11
0
static int reduce_peer(int bit)
{
  return pcu_mpi_rank() ^ bit;
}