Sending and receiving staggered blocks out of a 2-dim array _____________________________________________________________ !. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .| |a . . . . . . . . b b . . . . . . . . c c . . . . . . . . a| |a a . . . . . . b b b b . . . . . . c c c c . . . . . . a a| |a a a . . . . b b b b b b . . . . c c c c c c . . . . a a a| |a a a a . . b b b b b b b b . . c c c c c c c c . . a a a a| |a a a a a b b b b b b b b b b c c c c c c c c c c a a a a a| |a a a a A A b b b b b b b b B B c c c c c c c c C C a a a a| |a a a A A A A b b b b b b B B B B c c c c c c C C C C a a a| |a a A A A A A A b b b b B B B B B B c c c c C C C C C C a a| |a A A A A A A A A b b B B B B B B B B c c C C C C C C C C a| |A A A A A A A A A A B B B B B B B B B B C C C C C C C C C C| |. A A A A A A A A . . B B B B B B B B . . C C C C C C C C .| |. . A A A A A A . . . . B B B B B B . . . . C C C C C C . .| |. . . A A A A . . . . . . B B B B . . . . . . C C C C . . .| |. . . . A A . . . . . . . . B B . . . . . . . . C C . . . .| ------------------------------------------------------------- _____________________________________________________________ !. . . .|. . . . + + * * . . . .|. . . . . . . . . . . . . .| |a . . .|. . . + + b b * * . . .|. . . c c . . . . . . . . a| |a a . .|. . + + b b b b * * . .|. . c c c c . . . . . . a a| |a a a .|. + + b b b b b b * * .|. c c c c c c . . . . a a a| |a a a a|+ + b b b b b b b b * *|c c c c c c c c . . a a a a| |a a a a|a b b b b b b b b b b c|c c c c c c c c c a a a a a| |a a a a|A A b b b b b b b b B B|c c c c c c c c C C a a a a| |a a a A|A A A b b b b b b B B B|B c c c c c c C C C C a a a| |a a A A|A A A A b b b b B B B B|B B c c c c C C C C C C a a| |a A A A|A A A A A b b B B B B B|B B B c c C C C C C C C C a| |A A A A-A-A-A-A-A-A-B-B-B-B-B-B-B B B B C C C C C C C C C C| |. A A A A A A A A . . B B B B B B B B . . C C C C C C C C .| |. . A A A A A A . . . . B B B B B B . . . . C C C C C C . .| |. . . A A A A . . . . . . B B B B . . . . . . C C C C . . .| |. . . . A A . . . . . . . . B B . . . . . . . . C C . . . .| |. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .| _____________________________________________________________ !. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .| |a . . . . . . . . b b . . . . . . . . c c . . . . . . . . a| |a a . . . . . . b b b b . . . . . . c c c c . . . . . . a a| |a a a . . . . b b b b b b . . . . c c c c c c . . . . a a a| |a a a a . . b b b_b_b_b_b_b_._._c_c_c_c_c_c c c . . a a a a| |a a a a a b b b b|b b b b b b c c c c c c|c c c c a a a a a| |a a a a A A b b b|b b b b b B B c c c c c|c c c C C a a a a| |a a a A A A A b b|b b b b B B B B c c c c|c c C C C C a a a| |a a A A A A A A b|b b b B B B B B B c c c|c C C C C C C a a| |a A A A A A A A A|b b B B B B B B B B c c|C C C C C C C C a| |A A A A A A A A A|A B B B B B B B B B B C|C C C C C C C C C| |. A A A A A A A A|. . B B B B B B B B . .|C C C C C C C C .| |. . A A A A A A .|. . . B B B B B B . . .|. C C C C C C . .| |. . . A A A A . .|. . . . B B B B . . . .|. . C C C C . . .| |. . . . A A . . .|. . . . . B B . . . . .|. . . C C . . . .| |. . . . . . . . .-------------------------. . . . . . . . .| MPI_Type_vector( int count, int blocklen, int stride. MPI_Datatype element_type, MPI_Datatype* new_type) N is 30, p is 3, m = N/p is 10 // preparation for next step int A[12][10]; MPI_Datatype Staggered_pairs); MPI_Type_vector(5, 2, 13, MPI_INT, &Staggered_pairs); MPI_Type_commit(&Staggered_pairs); MPI_Send(&(A[5][1]), 1, Staggered_pairs, left_nbr, 0, MPI_COMM_WORLD); MPI_Recv(&(A[0][6]), 1, Staggered_pairs, right_nb , 0, MPI_COMM_WORLD); for (int i = 0; i < m/2; ++i) { A[i][j-i] = A[i+k][j-i+k]; A[i][j-i+1] = A[i+k][j-i+k+1]; } // [0][5] <-- [5][9], [0][6] <-- [5][10] // [1][4] <-- [6][8], [1][4] <-- [6][9] // [2][3] <-- [7][7], [2][3] <-- [7][8] // ... // j is k is m/2 Scattering a section of an array to each process: When send array size is N, with p processes => counts are N/p, recvbuf must have N/p space. ...When p doesn't evenly divide N ? MPI_Scatter(void* sendbuf, // buffer of size sendcount*p. int sendcount, // (wierdly) same as recvcount. MPI_Datatype sendtype, // generally same as recvtype // the above 3 send parameters signify for root only. void* recvbuf, // r-th block of recvcount items go here. int recvcount, // note that all recv a block, including root. MPI_Datatype recvtype, int root, // the rank of the sender (scatterer) MPI_Comm comm)