I am trying to parallelise some operations on a large numpy array using mpi4py. I am currently using numpy.array_split
to divide the array into chunks, followed by
The solution is to use comm.Scatterv
and comm.Gatherv
which send and receive the data as a block of memory, rather than a list of numpy arrays, getting around the data size issue. comm.Scatterv
and comm.Gatherv
assume a block of data in C-order (row-major) in memory and it is necessary to specify two vectors, sendcounts
and displacements
. Sendcounts
gives the integer value (index) for the positions at which to split the input data (i.e. the starting point of each vector to send to a given core), while displacements
gives the length of that vector. Hence it is possible to vary the amount of data sent to each core. More details can be found here: http://materials.jeremybejarano.com/MPIwithPython/collectiveCom.html
An example using comm.Scatterv
and comm.Gatherv
for a 2D matrix is given here:
Along what axis does mpi4py Scatterv function split a numpy array?