template<class ArrayT>
Definition at line 1142 of file PxDistribution.h. References _logCPUs, _maxCPUs, _nrCPUs, ArrayCD(), ArrayCH(), ArrayCPB(), ArrayCW(), ArrayD(), ArrayH(), ArrayPB(), ArrayW(), BCAST_TAG, and PxGetSBTorder(). Referenced by PxBcastArray(). 01143 { 01144 /*** Determine ordering of CPUs in Spanning Binomial Tree ***/ 01145 01146 int *order = new int[_maxCPUs], myIndex; 01147 PxGetSBTorder(root, _maxCPUs, order, &myIndex); 01148 01149 /*** Broadcast array data using Spanning Binomial Tree ***/ 01150 01151 int sSize = ArrayT::ElemSize()*sizeof(typename ArrayT::StorType); 01152 MPI_Datatype elem, blk2d, blk3d; 01153 MPI_Status stat; 01154 MPI_Type_contiguous(sSize, MPI_BYTE, &elem); 01155 MPI_Type_commit(&elem); 01156 01157 if (!bdata) { 01158 MPI_Type_vector(ArrayCH(a), 01159 ArrayCW(a), ArrayW(a), elem, &blk2d); 01160 MPI_Type_hvector(ArrayCD(a), 1, 01161 ArrayW(a)*ArrayH(a)*sSize, blk2d, &blk3d); 01162 MPI_Type_commit(&blk3d); 01163 } 01164 int mask = 1 << (_logCPUs-1); 01165 for (int i=0; i<_logCPUs; i++) { 01166 int partnerIndex = myIndex ^ mask; 01167 int partner = order[partnerIndex]; 01168 if ((myIndex % mask == 0) && (partner < _nrCPUs)) { 01169 if (myIndex < partnerIndex) { // send data to SBT child 01170 if (!bdata) { 01171 MPI_Send(ArrayCPB(a), 1, blk3d, 01172 partner, BCAST_TAG, MPI_COMM_WORLD); 01173 } else { 01174 MPI_Send(ArrayPB(a), 01175 ArrayW(a)*ArrayH(a)*ArrayD(a), elem, 01176 partner, BCAST_TAG, MPI_COMM_WORLD); 01177 } 01178 } else { // receive data from SBT parent 01179 if (!bdata) { 01180 MPI_Recv(ArrayCPB(a), 1, blk3d, partner, 01181 BCAST_TAG, MPI_COMM_WORLD, &stat); 01182 } else { 01183 MPI_Recv(ArrayPB(a), 01184 ArrayW(a)*ArrayH(a)*ArrayD(a), elem, 01185 partner, BCAST_TAG, MPI_COMM_WORLD, &stat); 01186 } 01187 } 01188 } 01189 mask >>= 1; 01190 } 01191 if (!bdata) { 01192 MPI_Type_free(&blk3d); 01193 MPI_Type_free(&blk2d); 01194 } 01195 MPI_Type_free(&elem); 01196 delete order; 01197 }
Here is the call graph for this function:
|