Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

template<class ArrayT>
static void Impala::Core::Array::Pattern::PxBcastArraySBT ( ArrayT *  a,
int  root,
bool  bdata 
) [inline, static]

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:


Generated on Fri Mar 19 11:02:47 2010 for ImpalaSrc by  doxygen 1.5.1