def distribute_list(source): """Distributes the list from root to individual nodes """ # quick check if SIZE == 1: return source if is_root(): length = len(source) if length == 0: logging.warning("Warning: List has length 0") else: length = 0 length = COMM.bcast(length) if length == 0: return [] segments = get_segments(length) if is_root(): for i in range(1, SIZE): send_list = source[segments[i]:segments[i + 1]] COMM.send(send_list, dest=i) data = source[:segments[1]] del source else: data = COMM.recv() return data
def distribute_list(source): """Distributes the list from root to individual nodes """ # quick check if SIZE == 1: return source if is_root(): length = len(source) if length == 0: logging.warning("Warning: List has length 0") else: length = 0 length = COMM.bcast(length) if length == 0: return [] segments = get_segments(length) if is_root(): for i in range(1,SIZE): send_list = source[segments[i]:segments[i+1]] COMM.send(send_list, dest=i) data = source[:segments[1]] del source else: data = COMM.recv() return data
def barrier(tag=0, sleep=0.01): ''' A better mpi barrier The original MPI.comm.barrier() may cause idle processes to still occupy the CPU, while this barrier waits. ''' if SIZE == 1: return mask = 1 while mask < SIZE: dst = (RANK + mask) % SIZE src = (RANK - mask + SIZE) % SIZE req = COMM.isend(None, dst, tag) while not COMM.Iprobe(src, tag): time.sleep(sleep) COMM.recv(None, src, tag) req.Wait() mask <<= 1
def barrier(tag=0, sleep=0.01): ''' A better mpi barrier The original MPI.comm.barrier() may cause idle processes to still occupy the CPU, while this barrier waits. ''' if SIZE == 1: return mask = 1 while mask < SIZE: dst = (RANK + mask) % SIZE src = (RANK - mask + SIZE) % SIZE req = COMM.isend(None, dst, tag) while not COMM.Iprobe(src, tag): time.sleep(sleep) COMM.recv(None, src, tag) req.Wait() mask <<= 1