static bool reduce_end_bit(int bit) { int rank = pcu_mpi_rank(); if (rank==0) return bit >= pcu_mpi_size(); return (bit>>1) & rank; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
static int bcast_peer(int bit) { return pcu_mpi_rank() ^ bit; }
static int reduce_peer(int bit) { return pcu_mpi_rank() ^ bit; }