Collective Communications Introduction Collective communication involves the sending
- Slides: 60
Collective Communications
Introduction • Collective communication involves the sending and receiving of data among processes. • In general, all movement of data among processes can be accomplished using MPI send and receive routines. • However, some sequences of communication operations are so common that MPI provides a set of collective communication routines to handle them. • These routines are built using point-to-point communication routines. • Even though you could build your own collective communication routines, these "blackbox" routines hide a lot of the messy details and often implement the most efficient algorithm known for that operation.
Introduction • Collective communication routines transmit data among all processes in a group. • It is important to note that collective communication calls do not use the tag mechanism of send/receive for associating calls. • Rather they are associated by order of program execution. Thus, the user must ensure that all processors execute the same collective communication calls and execute them in the same order.
Introduction • The collective communication routines allow data motion among all processors or just a specified set of processors. The notion of communicators that identify the set of processors specifically involved in exchanging data was introduced in Chapter 3 - Communicators. • The examples and discussion for this chapter assume that all of the processors participate in the data motion. • However, you may define your own communicator that provides for collective communication between a subset of processors.
Introduction • Note: – For many implementations of MPI, calls to collective communication routines will synchronize the processors. However, this synchronization is not guaranteed and you should not depend on it. – One routine, MPI_BARRIER, synchronizes the processes but does not pass data. It is nevertheless often categorized as one of the collective communications routines.
Topics • MPI provides the following collective communication routines: – Barrier synchronization across all processes – Broadcast from one process to all other processes – Global reduction operations such as sum, min, max or userdefined reductions – Gather data from all processes to one process – Scatter data from one process to all processes – Advanced operations where all processes receive the same result from a gather, scatter, or reduction. There is also a vector variant of most collective operations where each message can be a different size.
Barrier Synchronization
Definition • Used to block the calling process until all processes have entered the function. The call will return at any process only after all the processes or group members have entered the call.
Barrier Synchronization • There are occasions when some processors cannot proceed until other processors have completed their current instructions. A common instance of this occurs when the root process reads data and then transmits these data to other processors. The other processors must wait until the I/O is completed and the data are moved. • The MPI_BARRIER routine blocks the calling process until all group processes have called the function. When MPI_BARRIER returns, all processes are synchronized at the barrier.
Barrier Synchronization • MPI_BARRIER is done in software and can incur a substantial overhead on some machines. In general, you should only insert barriers when they are needed. int MPI_Barrier (MPI_Comm comm )
Broadcast
Definition • Used to send the message on the process with rank "root" to every process (including "root") in "comm". The argument root must have the same values on all processes. The contents of root's communication will be copied to all processes.
Broadcast • The MPI_BCAST routine enables you to copy data from the memory of the root processor to the same memory locations for other processors in the communicator.
Broadcast
Broadcast • In this example, one data value in processor 0 is broadcast to the same memory locations in the other 3 processors. Clearly, you could send data to each processor with multiple calls to one of the send routines. The broadcast routine makes this data motion a bit easier. • All processes call the following: o o o send_count = 1; root = 0; MPI_Bcast ( &a, send_count, MPI_INT, root, comm ) o o o
Broadcast • Syntax: MPI_Bcast ( send_buffer, send_count, send_type, rank, comm ) – The arguments for this routine are: • • • send_buffer send_count send_type rank comm in/out in in starting address of send buffer number of elements in send buffer data type of elements in send buffer rank of root process mpi communicator int MPI_Bcast ( void* buffer, int count, MPI_Datatype datatype, int rank, MPI_Comm comm )
Broadcast Code #include <stdio. h> #include <mpi. h> void main(int argc, char *argv[]) { int rank; double param; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(rank==5) param=23. 0; MPI_Bcast(¶m, 1, MPI_DOUBLE, 5, MPI_COMM_WORLD); printf("P: %d after broadcast parameter is %f n", rank, param); MPI_Finalize(); }
Broadcast Code • Output: P: 0 P: 5 P: 2 P: 3 P: 4 P: 1 P: 6 after broadcast param is after broadcast param is 23. 23.
Reduction
Definition • Used to combine the elements of each process's input buffer, using the operation "operator". Stores the combined value on the rank root process.
Reduction • The MPI_REDUCE routine enables you to – collect data from each processor – reduce these data to a single value (such as a sum or max) – and store the reduced result on the root processor
Reduction
Reduction • The example shown above sums the values of A on each processor and stores the results in X on processor 0. • The routine calls for this example are count = 1; rank = 0; MPI_Reduce ( &a, &x, count, MPI_REAL, MPI_SUM, rank, MPI_COMM_WORLD );
Reduction • In general, the calling sequence is MPI_Reduce( send_buffer, recv_buffer, count, data_type, reduction_operation, rank_of_receiving_process, communicator ) • MPI_REDUCE combines the elements provided in the send buffer, applies the specified operation (sum, min, max, . . . ), and returns the result to the receive buffer of the root process. • The send buffer is defined by the arguments send_buffer, count, and datatype. • The receive buffer is defined by the arguments recv_buffer, count, and datatype. • Both buffers have the same number of elements with the same type. The arguments count and datatype must have identical values in all processes. The argument rank, which is the location of the reduced result, must also be the same in all processes.
Predefined Operations for MPI_REDUCE Operation Description MPI_MAX maximum MPI_MIN minimum MPI_SUM sum MPI_PROD product MPI_LAND logical and MPI_BAND bit-wise and MPI_LOR logical or MPI_BOR bit-wise or MPI_LXOR logical xor MPI_BXOR bitwise xor MPI_MINLOC computes a global minimum and an index attached to the minimum value -- can be used to determine the rank of the process containing the minimum value MPI_MAXLOC computes a global maximum and an index attached to the rank of the process containing the minimum value
Reduction • Syntax: MPI_Reduce ( send_buffer, recv_buffer, count, datatype, operation, rank, comm ) – The arguments for this routine are: • send_buffer in address of send buffer • recv_buffer out address of receive buffer • count in number of elements in send buffer • datatype in data type of elements in send buffer • operation in reduction operation • rank in rank of root process • comm in mpi communicator int MPI_Reduce ( void* send_buffer, void* recv_buffer, int count, MPI_Datatype datatype, MPI_Op operation, int rank, MPI_Comm comm )
Reduction Code #include <stdio. h> #include <mpi. h> void main(int argc, char *argv[]) { int rank; int source, result, root; /* run on 10 processors */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); root=7; source=rank+1; MPI_Barrier(MPI_COMM_WORLD); MPI_Reduce(&source, &result, 1, MPI_INT, MPI_PROD, root, MPI_COMM_WORLD); if(rank==root) printf("PE: %d MPI_PROD result is %d n", rank, result); MPI_Finalize(); }
Reduction Code • Output: PE: 7 MPI_PROD result is 362880
Gather
Definition of MPI_GATHER • Used to collect the contents of each process's "sendbuf" and send it to the root process, which stores the messages in rank order.
MPI_GATHER • The MPI_GATHER routine is an all-to-one communication. MPI_GATHER has the same arguments as the matching scatter routines. The receive arguments are only meaningful to the root process. • When MPI_GATHER is called, each process (including the root process) sends the contents of its send buffer to the root process. The root process receives the messages and stores them in rank order. • The gather also could be accomplished by each process calling MPI_SEND and the root process calling MPI_RECV N times to receive all of the messages.
MPI_GATHER
MPI_GATHER • In this example, data values A on each processor are gathered and moved to processor 0 into contiguous memory locations. • The function calls for this example are send_count = 1; recv_rank = 0; MPI_Gather ( &a, send_count, MPI_REAL, &a, recv_count, MPI_REAL, recv_rank, MPI_COMM_WORLD ); • MPI_GATHER requires that all processes, including the root, send the same amount of data, and the data are of the same type. Thus send_count = recv_count.
MPI_GATHER • Syntax: MPI_Gather ( send_buffer, send_count, send_type, recv_buffer, recv_count, recv_rank, comm ) – The arguments for this routine are: • send_buffer in starting address of send buffer • send_count in number of elements in send buffer • send_type in data type of send buffer elements • recv_buffer out starting address of receive buffer • recv_count in number of elements in receive buffer for a single receive • recv_type in data type of elements in receive buffer • recv_rank in rank of receiving process • comm in mpi communicator int MPI_Gather ( void* send_buffer, int send_count, MPI_datatype send_type, void* recv_buffer, int recv_count, MPI_Datatype recv_type, int rank, MPI_Comm comm )
Gather Code #include <stdio. h> #include <mpi. h> void main(int argc, char *argv[]) { int rank, size; double param[16], mine; int sndcnt, rcvcnt; int i; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); sndcnt=1; mine=23. 0+rank; if(rank==7) rcvcnt=1; MPI_Gather(&mine, sndcnt, MPI_DOUBLE, param, rcvcnt, MPI_DOUBLE, 7, MPI_COMM_WORLD); if(rank==7) for(i=0; i<size; ++i) printf("PE: %d param[%d] is %f n", rank, i, param[i]); MPI_Finalize(); }
Gather Code • Output: PE: 7 param[0] is 23. 000000 PE: 7 param[1] is 24. 000000 PE: 7 param[2] is 25. 000000 PE: 7 param[3] is 26. 000000 PE: 7 param[4] is 27. 000000 PE: 7 param[5] is 28. 000000 PE: 7 param[6] is 29. 000000 PE: 7 param[7] is 30. 000000 PE: 7 param[8] is 31. 000000 PE: 7 param[9] is 32. 000000
Definition of MPI_ALLGATHER • Used to gather the contents of all processes, not just the root's. The type signatures of sendcount and sendtype at a process must be associated with those of recvcount and recvtype at any other process.
MPI_ALLGATHER • The calling sequence for MPI_ALLGATHER is exactly the same as the calling sequence for MPI_GATHER. • In the previous example, after the data are gathered into processor 0, you could then MPI_BCAST the gathered data to all of the other processors. It is more convenient and efficient to gather and broadcast with the single MPI_ALLGATHER operation. • The result is the following:
MPI_ALLGATHER Anything wrong in this figure? ?
Scatter
Definition • Opposite of MPI_GATHER. Distributes the message on the process with rank "root" among the processes in "comm".
Scatter • The MPI_SCATTER routine is a one-to-all communication. Different data are sent from the root process to each process (in rank order). • When MPI_SCATTER is called, the root process breaks up a set of contiguous memory locations into equal chunks and sends one chunk to each processor. The outcome is the same as if the root executed N MPI_SEND operations and each process executed an MPI_RECV. • The send arguments are only meaningful to the root process.
Scatter
Scatter • In this example, four contiguous data values, elements of processor 0 beginning at A , are copied with one element going to each processor at location A. • The function calls for this example are send_count = 1; recv_count = 1; send_rank = 0; MPI_Scatter ( &a, send_count, MPI_REAL, &a, recv_count, MPI_REAL, send_rank, MPI_COMM_WORLD );
Scatter • Syntax: MPI_Scatter ( send_buffer, send_count, send_type, recv_buffer, recv_count, recv_type, rank, comm ) – The arguments for this routine are: • send_buffer in starting address of send buffer • send_count in number of elements in send buffer to send to each process (not the total number sent) send_type in data type of send buffer elements recv_buffer out starting address of receive buffer recv_count in number of elements in receive buffer recv_type in data type of elements in receive buffer rank in rank of sending process comm in mpi communicator • • • int MPI_Scatter ( void* send_buffer, int send_count, MPI_datatype send_type, void* recv_buffer, int recv_count, MPI_Datatype recv_type, int rank, MPI_Comm comm )
Scatter Code #include <stdio. h> #include <mpi. h> void main(int argc, char *argv[]) { int rank, size, i; double param[8], mine; int sndcnt, rcvcnt; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); rcvcnt=1; if(rank==3) { for(i=0; i<8; ++i) param[i]=23. 0+i; sndcnt=1; } MPI_Scatter(param, sndcnt, MPI_DOUBLE, &mine, rcvcnt, MPI_DOUBLE, 3, MPI_COMM_WORLD); for(i=0; i<size; ++i) { if(rank==i) printf("P: %d mine is %f n", rank, mine); fflush(stdout); MPI_Barrier(MPI_COMM_WORLD); } MPI_Finalize(); }
Scatter Code • Output: P: 0 mine is 23. 000000 P: 1 mine is 24. 000000 P: 2 mine is 25. 000000 P: 3 mine is 26. 000000 P: 4 mine is 27. 000000 P: 5 mine is 28. 000000 P: 6 mine is 29. 000000 P: 7 mine is 30. 000000
Advanced Operations
MPI_ALLREDUCE • Definition – Used to combine the elements of each process's input buffer, using the operation "operator". Stores the combined value on the receive buffer of all group members. • MPI_ALLREDUCE is used to combine the elements of each process's input buffer • Stores the combined value on the receive buffer of all group members
User Defined Reduction Operations • Reduction can be defined to be an arbitrary operation
Gather / Scatter Vector Operations • MPI_GATHERV and MPI_SCATTERV allow a varying count of data from/to each process • Definition of MPI_GATHERV – Used to collect the contents of each process's "sendbuf" into "recvbuf" on the process with rank "root", extending the functionality of MPI_Gather by allowing a message of different sizes from each process. • Definition of MPI_SCATTERV – Opposite of MPI_GATHERV. Distributes the message on the process with rank "root" among the processes in "comm", extending the functionality of MPI_SCATTER by allowing a message of different sizes and displacement to be sent to each process.
Gather Vector Operations (MPI_Gatherv) Array a Recvcount p 0 len=4 p 1 len=5 p 2 len=6 p 3 len=7 Array b p 0 lena[0]=4 lena[1]=5 lena[2]=6 lena[3]=7 MPI_Gatherv(a, len, MPI_INT, b, lena, MPI_INT, 0, MPI_COMM_WORLD)
Scatter Vector Operation (MPI_Scatterv) Array a p 0 lena[0]=4 loca[0] lena[1]=5 loca[1] Array b lena[2]=6 loca[2] lena[3]=7 loca[3] Recvcount p 0 len=4 p 1 len=5 p 2 len=6 p 3 len=7 MPI_Scatterv(a, lena, loca, MPI_INT, b, len, MPI_INT, 0, MPI_COMM_WORLD)
Other Gather / Scatter Variations • MPI_ALLGATHER and MPI_ALLTOALL • Definition of MPI_ALLGATHER – Used to gather the contents of all processes, not just the root's. The type signatures of sendcount and sendtype at a process must be associated with those of recvcount and recvtype at any other process. • Definition of MPI_ALLTOALL – Used to carry out an all-to-all gather/scatter which scatters each process's data to each of the receivers. The type signature of the sendcount and sendtype at a process must be the same as that associated with recvcount and recvtype at another process. • No root process specified: all processes get gathered or scattered data • Send and receive arguments are meaningful to all processes
MPI_Allgather / MPI_Allltoall Data m 20 0 20 22 24 26 20 22 1 20 22 24 26 22 2 24 2 20 22 24 26 24 3 26 3 20 22 24 26 26 MPI_Allgather Processor b[0] b[1] b[2] b[3] 1 Processor m 0 b[0] b[1] b[2] b[3] MPI_Allgather(&m, 1, MPI_INT, b, 1, MPI_INT, MPI_COMM_WORLD); Data 1 5 6 7 8 2 9 10 11 12 3 13 14 15 16 MPI_Alltoall Processor 4 1 5 9 13 2 6 10 14 3 7 11 15 3 3 2 2 1 1 b[0] b[1] b[2] b[3] 0 0 Processor a[0] a[1] a[2] a[3] 4 8 12 16 MPI_Alltoall(a, 1, MPI_INT, b, 1, MPI_INT, MPI_COMM_WORLD);
MPI_SCAN • Definition – Used to carry out a prefix reduction on data throughout the group. Returns the reduction of the values of all of the processes. • MPI_SCAN is used to carry out a prefix reduction on data throughout the group • Returns the reduction of the values of all of the processes
MPI_REDUCE_SCATTER • Definition – Used to combine the contents of each process's operand using the operator. Scatters the result across all of the processes in comm. It has the same result as an MPI_REDUCE operation followed by MPI_SCATTER, in which the sendcounts equal recvcounts, except it may be faster. • MPI_REDUCE_SCATTER combines an MPI_REDUCE and an MPI_SCATTERV
MPI_REDUCE_SCATTER Data 1 5 6 7 8 2 9 10 11 12 3 13 14 15 16 MPI_Reduce_scatter Processor 4 1 2 3 4 28 5 6 7 8 32 9 10 11 12 36 3 3 2 2 b 1 1 a[0] a[1] a[2] a[3] 0 0 Processor a[0] a[1] a[2] a[3] 13 14 15 16 40 lena={1, 1, 1, 1} MPI_Reduce_scatter(a, &b, lena, MPI_INT, MPI_SUM, MPI_COMM_WORLD); Array a p 0 p 1 p 2 p 3 lena={1, 2, 3, 4} b
Patterns of Collective Communication From IBM Redbook
END
- What is collective communication
- Communication in general is process of sending
- The process of giving and receiving information
- The product of a sender's encoding is the
- What are the 6 parts of a business letter
- Send email sequence diagram
- Sample email for sending resume
- Sending synonyms
- Data-sending trojan
- Sending and receiving signals are special constructs of
- Pray that god will send laborers
- Objectives of listening in communication
- Two wire line communication involves
- Aggressive communication always involves manipulation
- An audience centered approach to communication involves
- Introduction to data communications
- Introduction to data communications and networking
- Hát kết hợp bộ gõ cơ thể
- Lp html
- Bổ thể
- Tỉ lệ cơ thể trẻ em
- Chó sói
- Tư thế worm breton là gì
- Bài hát chúa yêu trần thế alleluia
- Môn thể thao bắt đầu bằng chữ đua
- Thế nào là hệ số cao nhất
- Các châu lục và đại dương trên thế giới
- Công thức tính thế năng
- Trời xanh đây là của chúng ta thể thơ
- Mật thư anh em như thể tay chân
- Làm thế nào để 102-1=99
- Phản ứng thế ankan
- Các châu lục và đại dương trên thế giới
- Thể thơ truyền thống
- Quá trình desamine hóa có thể tạo ra
- Một số thể thơ truyền thống
- Bàn tay mà dây bẩn
- Vẽ hình chiếu vuông góc của vật thể sau
- Biện pháp chống mỏi cơ
- đặc điểm cơ thể của người tối cổ
- Thế nào là giọng cùng tên? *
- Vẽ hình chiếu đứng bằng cạnh của vật thể
- Fecboak
- Thẻ vin
- đại từ thay thế
- điện thế nghỉ
- Tư thế ngồi viết
- Diễn thế sinh thái là
- Các loại đột biến cấu trúc nhiễm sắc thể
- Số nguyên tố là
- Tư thế ngồi viết
- Lời thề hippocrates
- Thiếu nhi thế giới liên hoan
- ưu thế lai là gì
- Hươu thường đẻ mỗi lứa mấy con
- Sự nuôi và dạy con của hươu
- Hệ hô hấp
- Từ ngữ thể hiện lòng nhân hậu
- Thế nào là mạng điện lắp đặt kiểu nổi
- N parallel
- What is oral communication and written communication