[IPython-dev] ipython + MPI

Marek Wojciechowski wojciechowski_m at o2.pl
Wed Oct 18 15:32:09 EDT 2006

A while ago I have written a small patch to the last ipython (7.2) which  
consist mainly in writing the following function:

def mpi_raw_input(prompt):
     rank = 0; mpi = False; size = 1
         from mpi4py import MPI
         mpi = True
         rank = MPI.rank
	  size = MPI.size
	  line = ''
     except: pass
     sys.stdout.flush() #Just to avoid messy output
     if rank == 0:
         line = raw_input(prompt)  # Command is read by first process only
     if mpi and size > 1: line = COMM.Bcast(line, 0)  # And is broadcasted  
to all processes involved
     return line

Then at the top of iplib.py I made an assignment:  raw_input_original =  
instead of:  raw_input_original = raw_input

I'm using mpi4py package here from http://www.cimec.org.ar/python, but any  
mpi port to python could be used here.
This slight change allows to run ipython with simple:
     mpirun -np 4 ipython (assuming you have modern enough MPI  
All commands are read by first process only and broadcasted to all others  
for execution. With this it is possible to follow plain MPI approach to  
parallel execution:

[In]<1> 1+3
[Out][Proc0]<1> 4
[Out][Proc1]<1> 4
[Out][Proc3]<1> 4
[Out][Proc2]<1> 4

[In]<2> from mpi4py import MPI
[In]<3> if MPI.rank in [1, 3]: print "I'm process %i" %(MPI.rank)
I'm process 3
I'm process 1

[In]<5> from math import sin
[In]<6> bg sin(3)  # ipython magic works as well :)
Starting job # 0 in a separate thread.
Starting job # 0 in a separate thread.
Starting job # 0 in a separate thread.
Starting job # 0 in a separate thread.

Obviously, there are problems with standard output of ipython processes,  
as we are not always interested in output of all of them. However this can  
be handled in a similar way as the input, and was partially done (i made  
for example help messages produced by ipython to be displayed at first  
process only).

Now i observed that new ipython development introduces a parallel  
execution via "controllers" and "engines". Is the above very simple  
approach comparable in any way with this new development. How does it  
support MPI communication? What are the other advanteges of the new kernel  
above the current ipython?

Thanks for any replay

Marek Wojciechowski

More information about the IPython-dev mailing list