Mpi4py
Jump to navigation
Jump to search
Simple multi-process hello world
- helloworld.py:
#!/usr/bin/env python # chmod +x hellompi.py # mpiexec -n 10 hellompi.py from mpi4py import MPI size = MPI.COMM_WORLD.Get_size() rank = MPI.COMM_WORLD.Get_rank() name = MPI.Get_processor_name() print "Hello from process " + str(rank + 1) + " of " + str(size) + " on " + str(name)
run with
mpiexec -n 10 hellompi.py
Better spawned and reduced sum example
- master.py:
#!/usr/bin/env python from mpi4py import MPI from array import array def run(debug = False): worker = MPI.COMM_SELF.Spawn("worker.py", None, 3) data_size = 1000000 try: data = array('i') for i in range(0, data_size): data.append(1) print "Broadcasting input data len: ", len(data), " content: ", data[0] worker.Bcast([data, MPI.INT], root = MPI.ROOT) result = array('i', [0]) worker.Reduce(sendbuf = None, recvbuf = [result, MPI.INT], op = MPI.SUM, root = MPI.ROOT) result = result[0] # strange thing (Reduce logic) print "Calculated value of sum is", result except Exception as ex: print "Unexpected error:" print ex worker.Disconnect() def __main__(): run() __main__()
- worker.py:
#!/usr/bin/env python from mpi4py import MPI from array import array def run(debug = False): master = MPI.Comm.Get_parent() my_rank = master.Get_rank() n_procs = master.Get_size() data_size = 10241024 try: data = array('i') for i in range(0, data_size): data.append(0) master.Bcast([data, MPI.INT], root = 0) #print "# Broadcast finished and data on rank ", my_rank, " is len ", len(data), " data: ", data work_size = int(data_size / n_procs) work_start = my_rank * work_size work_limit = int(0) # if is the last proc, work_limit is the end of data if my_rank == (n_procs - 1): work_limit = data_size else: work_limit = work_start + work_size result = int(0) for i in range(work_start, work_limit): result += data[i] print "my_rank: ", my_rank, " work_start: ", work_start, " work_limit: ", work_limit, "result = ", result result = array('i', [result]) # strange thing (Reduce logic) master.Reduce(sendbuf = [result, MPI.INT], recvbuf = None, op = MPI.SUM, root = 0) except Exception as ex: print "# Unexpected error:" print ex #print "# Disconnecting from rank %d" % my_rank master.Disconnect() def __main__(): run() __main__()
run the code with
python master.py
Depends
apt-get install libopenmpi-dev python-mpi4py