template<class ArrayT>
Definition at line 1093 of file PxDistribution.h. References _myCPU, _nrCPUs, ArrayCD(), ArrayCH(), ArrayCPB(), ArrayCW(), ArrayD(), ArrayH(), ArrayPB(), ArrayW(), and BCAST_TAG. Referenced by PxBcastArray(). 01094 { 01095 /*** Broadcast array data using One-level Flat Tree ***/ 01096 01097 int sSize = ArrayT::ElemSize()*sizeof(typename ArrayT::StorType); 01098 MPI_Datatype elem, blk2d, blk3d; 01099 MPI_Status stat; 01100 MPI_Type_contiguous(sSize, MPI_BYTE, &elem); 01101 MPI_Type_commit(&elem); 01102 01103 if (!bdata) { 01104 MPI_Type_vector(ArrayCH(a), 01105 ArrayCW(a), ArrayW(a), elem, &blk2d); 01106 MPI_Type_hvector(ArrayCD(a), 1, 01107 ArrayW(a)*ArrayH(a)*sSize, blk2d, &blk3d); 01108 MPI_Type_commit(&blk3d); 01109 } 01110 if (_myCPU == root) { // send array data to all other CPUs 01111 for (int partner=0; partner<_nrCPUs; partner++) { 01112 if (partner != _myCPU) { 01113 if (!bdata) { 01114 MPI_Send(ArrayCPB(a), 1, 01115 blk3d, partner, BCAST_TAG, MPI_COMM_WORLD); 01116 } else { 01117 MPI_Send(ArrayPB(a), 01118 ArrayW(a)*ArrayH(a)*ArrayD(a), 01119 elem, partner, BCAST_TAG, MPI_COMM_WORLD); 01120 } 01121 } 01122 } 01123 } else { // receive array data from root 01124 if (!bdata) { 01125 MPI_Recv(ArrayCPB(a), 1, blk3d, root, 01126 BCAST_TAG, MPI_COMM_WORLD, &stat); 01127 } else { 01128 MPI_Recv(ArrayPB(a), ArrayW(a)*ArrayH(a)*ArrayD(a), 01129 elem, root, BCAST_TAG, MPI_COMM_WORLD, &stat); 01130 } 01131 } 01132 if (!bdata) { 01133 MPI_Type_free(&blk3d); 01134 MPI_Type_free(&blk2d); 01135 } 01136 MPI_Type_free(&elem); 01137 }
Here is the call graph for this function:
|