MPI Collective communication

Similar documents
Outline. Communication modes MPI Message Passing Interface Standard

MPI 5. CSCI 4850/5850 High-Performance Computing Spring 2018

MA471. Lecture 5. Collective MPI Communication

Introduction to the Message Passing Interface (MPI)

Outline. Communication modes MPI Message Passing Interface Standard. Khoa Coâng Ngheä Thoâng Tin Ñaïi Hoïc Baùch Khoa Tp.HCM

Parallel programming MPI

Programming with MPI Collectives

Distributed Memory Programming with MPI

CSE 613: Parallel Programming. Lecture 21 ( The Message Passing Interface )

MPI. (message passing, MIMD)

Collective Communication: Gatherv. MPI v Operations. root

Standard MPI - Message Passing Interface

HPC Parallel Programing Multi-node Computation with MPI - I

Basic MPI Communications. Basic MPI Communications (cont d)

Data parallelism. [ any app performing the *same* operation across a data stream ]

Collective Communication: Gather. MPI - v Operations. Collective Communication: Gather. MPI_Gather. root WORKS A OK

MPI - v Operations. Collective Communication: Gather

The MPI Message-passing Standard Practical use and implementation (V) SPD Course 6/03/2017 Massimo Coppola

Topics. Lecture 7. Review. Other MPI collective functions. Collective Communication (cont d) MPI Programming (III)

High Performance Computing

Cornell Theory Center. Discussion: MPI Collective Communication I. Table of Contents. 1. Introduction

Message Passing Interface

Collective Communications II

Collective Communication in MPI and Advanced Features

Recap of Parallelism & MPI

Collective Communications

Message Passing Interface. most of the slides taken from Hanjun Kim

High-Performance Computing: MPI (ctd)

CS 470 Spring Mike Lam, Professor. Distributed Programming & MPI

Distributed Memory Parallel Programming

Scalasca performance properties The metrics tour

Introduction to MPI. HY555 Parallel Systems and Grids Fall 2003

CS 470 Spring Mike Lam, Professor. Distributed Programming & MPI

Message Passing Interface - MPI

PCAP Assignment II. 1. With a neat diagram, explain the various stages of fixed-function graphic pipeline.

CEE 618 Scientific Parallel Computing (Lecture 5): Message-Passing Interface (MPI) advanced

Message-Passing Computing

Advanced MPI. Andrew Emerson

AgentTeamwork Programming Manual

Practical Course Scientific Computing and Visualization

Message Passing Interface

MPI MESSAGE PASSING INTERFACE

CS 179: GPU Programming. Lecture 14: Inter-process Communication

Introduction to MPI Part II Collective Communications and communicators

Parallel Programming. Using MPI (Message Passing Interface)

In the simplest sense, parallel computing is the simultaneous use of multiple computing resources to solve a problem.

CS4961 Parallel Programming. Lecture 16: Introduction to Message Passing 11/3/11. Administrative. Mary Hall November 3, 2011.

Distributed Memory Systems: Part IV

The Message Passing Interface (MPI): Parallelism on Multiple (Possibly Heterogeneous) CPUs

Parallel Programming, MPI Lecture 2

Practical Scientific Computing: Performanceoptimized

The Message Passing Interface (MPI): Parallelism on Multiple (Possibly Heterogeneous) CPUs

Lecture 9: MPI continued

Cluster Computing MPI. Industrial Standard Message Passing

CS 6230: High-Performance Computing and Parallelization Introduction to MPI

O.I. Streltsova, D.V. Podgainy, M.V. Bashashin, M.I.Zuev

MPI Message Passing Interface

Message Passing with MPI

Parallel Computing Paradigms

Parallel Computing and the MPI environment

Tutorial 2: MPI. CS486 - Principles of Distributed Computing Papageorgiou Spyros

MPI - The Message Passing Interface

COMP 322: Fundamentals of Parallel Programming. Lecture 34: Introduction to the Message Passing Interface (MPI), contd

Advanced MPI. Andrew Emerson

MPI and OpenMP (Lecture 25, cs262a) Ion Stoica, UC Berkeley November 19, 2016

Scalasca performance properties The metrics tour

COMP 322: Fundamentals of Parallel Programming

Chapter 3. Distributed Memory Programming with MPI

L15: Putting it together: N-body (Ch. 6)!

Parallel Computing. Distributed memory model MPI. Leopold Grinberg T. J. Watson IBM Research Center, USA. Instructor: Leopold Grinberg

Introduzione al Message Passing Interface (MPI) Andrea Clematis IMATI CNR

Message Passing Interface

Chapter 4. Message-passing Model

Report S1 C. Kengo Nakajima. Programming for Parallel Computing ( ) Seminar on Advanced Computing ( )

MPI MESSAGE PASSING INTERFACE

Performance properties The metrics tour

Parallel Computing. MPI Collective communication

Introduction to MPI. May 20, Daniel J. Bodony Department of Aerospace Engineering University of Illinois at Urbana-Champaign

Topic Notes: Message Passing Interface (MPI)

Parallel Programming in C with MPI and OpenMP

Chip Multiprocessors COMP Lecture 9 - OpenMP & MPI

Collective Communications I

Parallel Programming in C with MPI and OpenMP

Chapter 8 Matrix-Vector Multiplication

Peter Pacheco. Chapter 3. Distributed Memory Programming with MPI. Copyright 2010, Elsevier Inc. All rights Reserved

Distributed Memory Programming with MPI. Copyright 2010, Elsevier Inc. All rights Reserved

Message-Passing and MPI Programming

The Message Passing Interface (MPI) TMA4280 Introduction to Supercomputing

Performance properties The metrics tour

Holland Computing Center Kickstart MPI Intro

Intermediate MPI. M. D. Jones, Ph.D. Center for Computational Research University at Buffalo State University of New York

Introduction to MPI. Ritu Arora Texas Advanced Computing Center June 17,

Performance properties The metrics tour

The Message Passing Model

Parallel Programming Using MPI

CDP. MPI Derived Data Types and Collective Communication

CPS 303 High Performance Computing

Parallel Programming with MPI MARCH 14, 2018

Slides prepared by : Farzana Rahman 1

Lecture Topic: Multi-Core Processors: MPI 1.0 Overview (Part-II)

Transcription:

MPI Collective communication CPS343 Parallel and High Performance Computing Spring 2018 CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 1 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 2 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 3 / 43

List of MPI collective communication routines MPI provides the following routines for collective communication: MPI_Bcast() MPI_Reduce() MPI_Allreduce() MPI_Scatter() MPI_Gather() MPI_Alltoall() MPI_Allgather() Broadcast (one to all) Reduction (all to one) Reduction (all to all) Distribute data (one to all) Collect data (all to one) Distribute data (all to all) Collect data (all to all) We ve already been introduced to the first three. Today we focus on the last four and on using all of these in programs. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 4 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 5 / 43

Scattering data A common parallel programming model involves 1 read in or generate data on single (root) process 2 distribute data to worker processes 3 perform work in parallel 4 collect data back on root process 5 output or save data to file We ve already seen how MPI_Bcast() can be used to send identical data to all processes. The model here, however, assumes that different data is sent to each process. The MPI_Scatter() function does exactly this. Typically data is in an array on the root process and we want to send a different portion of of the array to each worker process (often including the root). CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 6 / 43

MPI Scatter() example Suppose there are four processes including the root (process 0). A 16 element array u on the root should be distributed among the processes and stored locally in v. Every process should include the following line: MPI_Scatter(u, 4, MPI_INT, v, 4, MPI_INT, 0, MPI_COMM_WORLD); u = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 v = 0 1 2 3 Rank 0 v = 4 5 6 7 1 v = 8 9 10 11 2 v = 12 13 14 15 3 CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 7 / 43

MPI Scatter() The calling sequence for MPI_Scatter() is int MPI_ Scatter ( void * sendbuf, // pointer to send buffer int sendcount, // items to send per process MPI_ Datatype sendtype, // type of send buffer data void * recvbuf, // pointer to receive buffer int recvcount, // number of items to receive MPI_ Datatype recvtype, // type of receive buffer data int root, // rank of sending process MPI_ Comm comm ) // MPI communicator to use The contents of sendbuf on process with rank root are distributed in groups of sendcount elements of type sendtype to all processes. sendbuf should contain at least sendcount number_of_processes data items of type sendtype where number_of_processes is the number of processes returned by MPI_Comm_size(). Each process, including the root, receives recvcount elements of type recvtype into recvbuf. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 8 / 43

MPI Scatter() Note: All arguments are significant on root process All but first three arguments are significant on all other processes, but first three arguments must be supplied and so must be declared. In particular sendbuf must be declared but may be a NULL pointer. Usually sendtype and recvtype are the same and sendcount and recvcount are the same, but this is not required; type conversion is possible. Like MPI_Bcast(), all processes that belong to the specified communicator must participate in the scatter operation. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 9 / 43

Another data distribution function The MPI_Scatter() function is a one-to-all operation; one process distributes data to all the processes, including itself. In some cases data from all processes must be redistributed as if each process called MPI_Scatter(). The MPI function MPI_Alltoall() can be used to do this. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 10 / 43

MPI Alltoall() example Suppose there are four processes including the root, each with arrays as shown below on the left. After the all-to-all operation MPI_Alltoall(u, 2, MPI_INT, v, 2, MPI_INT, MPI_COMM_WORLD); the data will be distributed as shown below on the right: array u 10 11 12 13 14 15 16 17 Rank 0 array v 10 11 20 21 30 31 40 41 20 21 22 23 24 25 26 27 1 12 13 22 23 32 33 42 43 30 31 32 33 34 35 36 37 2 14 15 24 25 34 35 44 45 40 41 42 43 44 45 46 47 3 16 17 26 27 36 37 46 47 CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 11 / 43

MPI Alltoall() The calling sequence for MPI_Alltoall() is int MPI_ Alltoall ( void * sendbuf, // pointer to send buffer int sendcount, // items to send per process MPI_ Datatype sendtype, // type of send buffer data void * recvbuf, // pointer to receive buffer int recvcount, // number of items to receive MPI_ Datatype recvtype, // type of receive buffer data MPI_ Comm comm ) // MPI communicator to use The contents of sendbuf on each process are distributed in groups of sendcount elements of type sendtype to all processes. sendbuf should contain at least sendcount number_of_processes data items of type sendtype. Each process receives recvcount elements of type recvtype into recvbuf. All arguments are significant on all processes. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 12 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 13 / 43

MPI Gather() MPI provides the MPI_Gather() function to collect distinct data elements from multiple processes and combine them in a single buffer on one process. The gather operation is the inverse of the scatter operation and the calling sequence is similar. int MPI_ Gather ( void * sendbuf, // pointer to send buffer int sendcount, // number of items to send MPI_ Datatype sendtype, // type of send buffer data void * recvbuf, // pointer to receive buffer int recvcount, // items to receive per process MPI_ Datatype recvtype, // type of receive buffer data int root, // rank of receiving process MPI_ Comm comm ) // MPI communicator to use CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 14 / 43

MPI Gather() notes Note: The contents from each process sendbuf are sent to the root process and placed in consecutive groups in rank order in the root process recvbuf. recvbuf must be declared on all processes, but may be NULL on non-root processes. The root process must have enough space to hold at least recvcount number_of_processes elements of type recvtype. As in the case of MPI_Scatter(), all processes associated with the communicator must participate in the gather operation. All arguments are significant on the root process. All but recvbuf, recvcount, and recvtype are significant on all other processes. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 15 / 43

MPI Gather() example Assume the variable rank contains the process rank. What will be stored in array b[] on each of four processes if each executes the following code fragment? int b [4] = {0, 0, 0, 0; MPI_ Gather ( & rank, 1, MPI_INT, b, 1, MPI_INT, 3, MPI_ COMM_ WORLD ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 16 / 43

MPI Gather() example Assume the variable rank contains the process rank. What will be stored in array b[] on each of four processes if each executes the following code fragment? Answer: int b [4] = {0, 0, 0, 0; MPI_ Gather ( & rank, 1, MPI_INT, b, 1, MPI_INT, 3, MPI_ COMM_ WORLD ); rank 0: b[] = {0, 0, 0, 0 rank 1: b[] = {0, 0, 0, 0 rank 2: b[] = {0, 0, 0, 0 rank 3: b[] = {0, 1, 2, 3 CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 16 / 43

MPI Allgather() MPI_Gather() collects data from all processes on a single process. In some instances each process needs to gather the same data from all processes. To do this, MPI provides MPI_Allgather(). This function works just like MPI_Gather() except the recvbuf is filled on all processes. The calling sequence for MPI_Allgather() is: int MPI_ Allgather ( void * sendbuf, // pointer to send buffer int sendcount, // number of items to send MPI_ Datatype sendtype, // type of send buffer data void * recvbuf, // pointer to receive buffer int recvcount, // items to receive per process MPI_ Datatype recvtype, // type of receive buffer data MPI_ Comm comm ) // MPI communicator to use CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 17 / 43

MPI Allgather() example What will be stored in array b[] on each of four processes if each executes the following code fragment? int b [4] = {0, 0, 0, 0; MPI_ Allgather ( & rank, 1, MPI_INT, b, 1, MPI_INT, MPI_ COMM_ WORLD ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 18 / 43

MPI Allgather() example What will be stored in array b[] on each of four processes if each executes the following code fragment? Answer: int b [4] = {0, 0, 0, 0; MPI_ Allgather ( & rank, 1, MPI_INT, b, 1, MPI_INT, MPI_ COMM_ WORLD ); rank 0: b[] = {0, 1, 2, 3 rank 1: b[] = {0, 1, 2, 3 rank 2: b[] = {0, 1, 2, 3 rank 3: b[] = {0, 1, 2, 3 CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 18 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 19 / 43

Four more collective communication routines The four routines we ve just considered all communicate the same amount of data to or from processes. MPI provides four more routines that work identically to these four except the amount of data transferred can vary from process to process. These routines have the same names as their uniform data counterparts but with a v (for vector) appended: MPI_Scatterv() MPI_Gatherv() MPI_Alltoallv() MPI_Allgatherv() Distribute data (one to all) Collect data (all to one) Distribute data (all to all) Collect data (all to all) CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 20 / 43

MPI Scatterv() As an example of how these functions are used, we examine the calling sequence for MPI_Scatter() int MPI_ Scatterv ( void * sendbuf, // pointer to send buffer int * sendcounts, // array of send counts int * displs, // array of displacements MPI_ Datatype sendtype, // type of send buffer data void * recvbuf, // pointer to receive buffer int recvcount, // number of items to receive MPI_ Datatype recvtype, // type of receive buffer data int root, // rank of sending process MPI_ Comm comm ) // MPI communicator to use Here sendcounts is an array of counts corresponding to the number of data items to be sent to each process. Likewise, displs is an array of offsets from the start of sendbuf to the start of the data to be sent to each process. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 21 / 43

Other collective routines MPI provides even more collective routines. Other communication routines include MPI_Reduce_scatter(): a reduction followed by a scatter. MPI_Scan(): performs a prefix reduction on distributed data. Another important collective operation is a barrier; a synchronation point for all cooperating processes. The calling sequence is simple: MPI_Barrier(MPI_Comm comm) Read the MPI documentation for information on these and other functions. CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 22 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 23 / 43

Scatter/Gather example prolog // In this program a scatter operation distributes the // individual elements of an array of integers among the // processes. Each process modifies the value it receives // and then participates in a gather operation that // collects the modified data in the master process where // they are once again assembled into the original array. # include <stdio.h> # include <mpi.h> const int MASTER_ RANK = 0; // Rank of of the master process // Set the number of elements that should be // sent to each process. The number of elements // in the entire array will be a multiple of // this value. const int SIZE_ PER_ PROCESS = 2; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 24 / 43

Scatter/Gather example main (1) int main ( int argc, char * argv [] ) { // Initialize the MPI system and determine the // number of collaborating processes and the rank // of the current process. int numproc, rank ; MPI_Init ( &argc, & argv ); MPI_ Comm_ size ( MPI_COMM_WORLD, & numproc ); MPI_ Comm_ rank ( MPI_COMM_WORLD, & rank ); // The master process allocates and initializes // the u array of integers. Other processes will // need a valid pointer in their scatter / gather // calls, but it will be ignored and so can be // NULL. Each process needs array v to receive // data into. int * u = NULL ; int * v = new int [ SIZE_ PER_ PROCESS ]; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 25 / 43

Scatter/Gather example main (2) if ( rank == MASTER_ RANK ) { // Master process allocates array and fills // it with data. The values in the array are // 100 * ( rank +1) plus the an offset from // 0.. SIZE_ PER_ PROCESS. u = new int [ numproc * SIZE_ PER_ PROCESS ]; printf ( " Master : Scattering =" ); for ( int i = 0; i < numproc ; i ++ ) { for ( int j = 0; j < SIZE_ PER_ PROCESS ; j ++ ) { int k = i * SIZE_ PER_ PROCESS + j; u[ k] = 100 * ( i + 1 ) + j; printf ( "%5d", u[k] ); printf ( "\n" ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 26 / 43

Scatter/Gather example main (3) // Each process participates in the scatter ; // the first three parameters (" the source ") // are used if the process rank matches the // next - to - last parameter. All processes use // the next three parameters (" the destination "). MPI_ Scatter ( u, SIZE_ PER_ PROCESS, MPI_INT, v, SIZE_ PER_ PROCESS, MPI_INT, MASTER_RANK, MPI_ COMM_ WORLD ); // Each process, including the master, adds a // distinguishable value to received data. printf ( " Process %2d: ", rank ); for ( int i = 0; i < SIZE_ PER_ PROCESS ; i ++ ) { printf ( " (%4 d", v[i] ); v[ i] += 1000 * ( rank + 1 ); printf ( " -> %4d)", v[i] ); printf ( "\n" ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 27 / 43

Scatter/Gather example main (4) // Each process participates in the gather. Source // parameters are used by each process but only the // master process makes use of destination parameters. MPI_ Gather ( v, SIZE_ PER_ PROCESS, MPI_INT, u, SIZE_ PER_ PROCESS, MPI_INT, MASTER_RANK, MPI_ COMM_ WORLD ); if ( rank == MASTER_ RANK ) { // Master process displays assembled data printf ( " Master : Received =" ); for ( int i = 0; i < numproc ; i ++ ) { for ( int j = 0; j < SIZE_ PER_ PROCESS ; j ++ ) { int k = i * SIZE_ PER_ PROCESS + j; printf ( "%5d", u[k] ); printf ( "\n" ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 28 / 43

Scatter/Gather example main (5) // clean up delete [] u; delete [] v; MPI_Finalize (); return 0; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 29 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 30 / 43

Alltoall example prolog // Demonstration of MPI_ Alltoall () // // In this program an all - to - all operation distributes // the individual elements of an array from each process // to all the processes. # include < cstdio > # include < unistd.h> # include <mpi.h> // Set the number of elements that should be sent to // each process. The number of elements in the entire // array will be a multiple of this value. const int SIZE_ PER_ PROCESS = 2; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 31 / 43

Alltoall example main (1) int main ( int argc, char * argv [] ) { // Initialize the MPI system and determine the number // of collaborating processes and the rank of the // current process. int numproc, rank ; MPI_Init ( &argc, & argv ); MPI_ Comm_ size ( MPI_COMM_WORLD, & numproc ); MPI_ Comm_ rank ( MPI_COMM_WORLD, & rank ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 32 / 43

Alltoall example main (2) // Construct array of data for this process. // The values in the array have the form RXYY where // " R" is rank of this process, // " X" is the group number (1.. number_ of_ processes ); // this is also the destination rank, and // " YY" is a counter value that starts at 00 and // works up to SIZE_ PER_ PROCESS -1. int * u = new int [ numproc * SIZE_ PER_ PROCESS ]; int * v = new int [ numproc * SIZE_ PER_ PROCESS ]; for ( int i = 0; i < numproc ; i ++ ) { for ( int j = 0; j < SIZE_ PER_ PROCESS ; j ++ ) { int k = i * SIZE_ PER_ PROCESS + j; u[ k] = 1000 * rank + 100 * i + j; v[ k] = 0; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 33 / 43

Alltoall example main (3) // Display constructed data dumpdata ( rank, numproc, SIZE_ PER_ PROCESS, u, " Before " ); // Each process participates in the all - to - all operation MPI_ Alltoall ( u, SIZE_ PER_ PROCESS, MPI_INT, v, SIZE_ PER_ PROCESS, MPI_INT, MPI_ COMM_ WORLD ); // Display received data dumpdata ( rank, numproc, SIZE_ PER_ PROCESS, v, " After " ); // Clean up delete [] u; delete [] v; MPI_Finalize (); return 0; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 34 / 43

Alltoall example dumpdata (1) void dumpdata ( int rank, int numproc, int dataperprocess, int * v, const char * label, bool sync = true ) // // Displays data stored in each process. Optionally uses // MPI_ Barrier () and usleep () to synchronize output in // process rank order. // // Input : // int rank - process rank // int numproc - number of processes // int * v - array of data to display // const char * label - label for data (8 character max ) // bool sync - Synchronize with barrier if true // ( default = true ) // // Display : // Integer data in array v. Displays 4 place values with // leading zeros. // CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 35 / 43

Alltoall example dumpdata (2) { for ( int p = 0; p < numproc ; p ++ ) { if ( rank == p ) { // It s my turn to display data... printf ( " Process %2 d: % -8 s =", rank, label ); for ( int i = 0; i < numproc ; i ++ ) { for ( int j = 0; j < dataperprocess ; j ++ ) { int k = i * dataperprocess + j; printf ( " %04 d", v[k] ); printf ( "\n" ); fflush ( stdout ); if ( sync ) { MPI_ Barrier ( MPI_ COMM_ WORLD ); usleep ( 10000 ); // pause 0.01 seconds for I/ O CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 36 / 43

Outline 1 MPI Collective communication functions List of collective communication functions Scattering data Gathering data Other collective communication routines 2 Example programs Scatter/Gather example All-to-all example Vector scatter example CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 37 / 43

Vector Scatter example prolog // Demonstration of MPI_ Scatterv () and MPI_ Gather () // // Demonstrate a vector scatter operation to distribute // elements in an array of integers among the processes. // Each process receives one more integer than its rank. // For example, in the case of N processes : // Rank 0: receives 1 integer, // Rank 1: receives 2 integers, //...... // Rank N -1: receives N integers. // Since 1 + 2 + 3 +... + N = N( N +1)/2, the array containing // the integers to distribute will hold N( N +1)/2 integers. // // Each process sums the values it receives. A gather // operation is used to collect these back on the master. # include <stdio.h> # include <mpi.h> const int MASTER_ RANK = 0; // Rank of of the master process CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 38 / 43

Vector Scatter example main (1) int main ( int argc, char * argv [] ) { // Initialize the MPI system int numproc, rank ; MPI_Init ( &argc, & argv ); MPI_ Comm_ size ( MPI_COMM_WORLD, & numproc ); MPI_ Comm_ rank ( MPI_COMM_WORLD, & rank ); // The master process allocates and initializes the u[] // array of integers as well as arrays that hold the // number of items to send to each process and the // offsets to the start of each process data in the // send buffer. int * u = NULL ; int * v = NULL ; int * sendcounts = NULL ; int * displs = NULL ; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 39 / 43

Vector Scatter example main (2) v = new int [ rank + 1]; // receive buffer on each proc. if ( rank == MASTER_ RANK ) { // Master process allocates and fills the arrays u = new int [ numproc * ( numproc + 1 ) / 2]; sendcounts = new int [ numproc ]; displs = new int [ numproc ]; int k = 0; printf ( " Master : Scattering :\ n" ); for ( int i = 0; i < numproc ; i ++ ) { for ( int j = 0; j <= i; j ++ ) { u[ k] = 100 + k; printf ( " %4d", u[k ++] ); printf ( "\n" ); sendcounts [ i] = i + 1; // destination rank plus 1 displs [ i] = i * ( i + 1 ) / 2; // offset to start printf ( "\n" ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 40 / 43

Vector Scatter example main (3) // Each process ( including the master ) participates // in the vector scatter. Each process will receive // one more integer than their rank. int recvcount = rank + 1; MPI_ Scatterv ( u, sendcounts, displs, MPI_INT, v, recvcount, MPI_INT, MASTER_RANK, MPI_ COMM_ WORLD ); // Each process sums the values they received int sum = 0; for ( int i = 0; i <= rank ; i ++ ) sum += v[ i]; // Each process participates in the gather. MPI_ Gather ( & sum, 1, MPI_INT, u, 1, MPI_INT, MASTER_RANK, MPI_ COMM_ WORLD ); CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 41 / 43

Vector Scatter example main (4) if ( rank == MASTER_ RANK ) { // Master process displays assembled data printf ( " Master : Received :\n" ); for ( int i = 0; i < numproc ; i ++ ) { printf ( "u[%d] = %d\n", i, u[i] ); // clean up delete [] u; delete [] v; delete [] sendcounts ; delete [] displs ; MPI_Finalize (); return 0; CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 42 / 43

Example Output $ mpiexec -n 4 scatterv Master : Scattering : 100 101 102 103 104 105 106 107 108 109 Master : Received : u [0] = 100 u [1] = 203 u [2] = 312 u [3] = 430 CPS343 (Parallel and HPC) MPI Collective communication Spring 2018 43 / 43