parallel_mpi.ipynb
186 lines
| 4.2 KiB
| text/plain
|
TextLexer
Fernando Perez
|
r4911 | { | |
MinRK
|
r5981 | "metadata": { | |
"name": "parallel_mpi" | |||
Brian Granger
|
r6035 | }, | |
"nbformat": 3, | |||
MinRK
|
r7739 | "nbformat_minor": 0, | |
MinRK
|
r5981 | "worksheets": [ | |
{ | |||
"cells": [ | |||
{ | |||
MinRK
|
r7739 | "cell_type": "heading", | |
"level": 1, | |||
"metadata": {}, | |||
"source": [ | |||
"Simple usage of a set of MPI engines" | |||
] | |||
}, | |||
{ | |||
Brian Granger
|
r6035 | "cell_type": "markdown", | |
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r5981 | "source": [ | |
MinRK
|
r7739 | "This example assumes you've started a cluster of N engines (4 in this example) as part\n", | |
"of an MPI world. \n", | |||
"\n", | |||
"Our documentation describes [how to create an MPI profile](http://ipython.org/ipython-doc/dev/parallel/parallel_process.html#using-ipcluster-in-mpiexec-mpirun-mode)\n", | |||
"and explains [basic MPI usage of the IPython cluster](http://ipython.org/ipython-doc/dev/parallel/parallel_mpi.html).\n", | |||
"\n", | |||
"\n", | |||
"For the simplest possible way to start 4 engines that belong to the same MPI world, \n", | |||
"you can run this in a terminal:\n", | |||
"\n", | |||
"<pre>\n", | |||
"ipcluster start --engines=MPI -n 4\n", | |||
"</pre>\n", | |||
"\n", | |||
"or start an MPI cluster from the cluster tab if you have one configured.\n", | |||
"\n", | |||
MinRK
|
r5981 | "Once the cluster is running, we can connect to it and open a view into it:" | |
] | |||
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "code", | |
"collapsed": true, | |||
MinRK
|
r5981 | "input": [ | |
MinRK
|
r7739 | "from IPython.parallel import Client\n", | |
"c = Client()\n", | |||
MinRK
|
r5981 | "view = c[:]" | |
Brian Granger
|
r6035 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
Brian Granger
|
r6035 | "outputs": [], | |
MinRK
|
r7739 | "prompt_number": 1 | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "markdown", | |
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r5981 | "source": [ | |
"Let's define a simple function that gets the MPI rank from each engine." | |||
] | |||
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "code", | |
"collapsed": true, | |||
MinRK
|
r5981 | "input": [ | |
MinRK
|
r7739 | "@view.remote(block=True)\n", | |
"def mpi_rank():\n", | |||
" from mpi4py import MPI\n", | |||
" comm = MPI.COMM_WORLD\n", | |||
MinRK
|
r5981 | " return comm.Get_rank()" | |
Brian Granger
|
r6035 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
Brian Granger
|
r6035 | "outputs": [], | |
MinRK
|
r7739 | "prompt_number": 2 | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "code", | |
"collapsed": false, | |||
MinRK
|
r5981 | "input": [ | |
"mpi_rank()" | |||
Brian Granger
|
r6035 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r5981 | "outputs": [ | |
{ | |||
Brian Granger
|
r6035 | "output_type": "pyout", | |
MinRK
|
r7739 | "prompt_number": 3, | |
MinRK
|
r5981 | "text": [ | |
MinRK
|
r7739 | "[2, 3, 1, 0]" | |
MinRK
|
r5981 | ] | |
} | |||
Brian Granger
|
r6035 | ], | |
MinRK
|
r7739 | "prompt_number": 3 | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "markdown", | |
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r5981 | "source": [ | |
MinRK
|
r7739 | "To get a mapping of IPython IDs and MPI rank (these do not always match),\n", | |
"you can use the get_dict method on AsyncResults." | |||
MinRK
|
r5981 | ] | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "code", | |
"collapsed": false, | |||
MinRK
|
r5981 | "input": [ | |
MinRK
|
r7739 | "mpi_rank.block = False\n", | |
"ar = mpi_rank()\n", | |||
"ar.get_dict()" | |||
Brian Granger
|
r6035 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r5981 | "outputs": [ | |
{ | |||
MinRK
|
r7739 | "output_type": "pyout", | |
"prompt_number": 4, | |||
MinRK
|
r5981 | "text": [ | |
MinRK
|
r7739 | "{0: 2, 1: 3, 2: 1, 3: 0}" | |
MinRK
|
r5981 | ] | |
} | |||
Brian Granger
|
r6035 | ], | |
MinRK
|
r7739 | "prompt_number": 4 | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "markdown", | |
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r5981 | "source": [ | |
MinRK
|
r7739 | "With %%px cell magic, the next cell will actually execute *entirely on each engine*:" | |
MinRK
|
r5981 | ] | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "code", | |
"collapsed": true, | |||
MinRK
|
r5981 | "input": [ | |
MinRK
|
r7739 | "%%px\n", | |
"from mpi4py import MPI\n", | |||
"\n", | |||
"comm = MPI.COMM_WORLD\n", | |||
"size = comm.Get_size()\n", | |||
"rank = comm.Get_rank()\n", | |||
"\n", | |||
"if rank == 0:\n", | |||
" data = [(i+1)**2 for i in range(size)]\n", | |||
"else:\n", | |||
" data = None\n", | |||
"data = comm.scatter(data, root=0)\n", | |||
"\n", | |||
MinRK
|
r5981 | "assert data == (rank+1)**2, 'data=%s, rank=%s' % (data, rank)" | |
Brian Granger
|
r6035 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
Brian Granger
|
r6035 | "outputs": [], | |
MinRK
|
r7739 | "prompt_number": 5 | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "code", | |
"collapsed": false, | |||
MinRK
|
r5981 | "input": [ | |
"view['data']" | |||
Brian Granger
|
r6035 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r5981 | "outputs": [ | |
{ | |||
Brian Granger
|
r6035 | "output_type": "pyout", | |
MinRK
|
r7739 | "prompt_number": 6, | |
MinRK
|
r5981 | "text": [ | |
MinRK
|
r7739 | "[9, 16, 4, 1]" | |
MinRK
|
r5981 | ] | |
} | |||
Brian Granger
|
r6035 | ], | |
MinRK
|
r7739 | "prompt_number": 6 | |
Brian Granger
|
r6035 | }, | |
MinRK
|
r5981 | { | |
Brian Granger
|
r6035 | "cell_type": "code", | |
"collapsed": true, | |||
"input": [], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
"outputs": [], | |||
"prompt_number": 6 | |||
MinRK
|
r5981 | } | |
MinRK
|
r7739 | ], | |
"metadata": {} | |||
MinRK
|
r5981 | } | |
] | |||
Fernando Perez
|
r4911 | } |