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

template<class ArithT, class RedOpT>
static ArithT Impala::Core::Array::Pattern::PxReduceValueToRootSBT ( ArithT  val,
RedOpT  redOp,
int  root 
) [inline, static]

Definition at line 411 of file PxDistribution.h.

References _logCPUs, _maxCPUs, _nrCPUs, PxGetSBTorder(), and RDUCE_TAG.

Referenced by PxReduceValueToAllSBT(), and PxReduceValueToRoot().

00412 {
00413     /*** Determine ordering of CPUs in Spanning Binomial Tree ***/
00414 
00415     int *order = new int[_maxCPUs], myIndex;
00416     PxGetSBTorder(root, _maxCPUs, order, &myIndex);
00417 
00418     /*** Reduce value to root using Spanning Binomial Tree ***/
00419 
00420     ArithT result = ArithT(val);
00421     MPI_Datatype elem;
00422     MPI_Status stat;
00423     MPI_Type_contiguous(sizeof(ArithT), MPI_BYTE, &elem);
00424     MPI_Type_commit(&elem);
00425 
00426     int mask = 1;
00427     for (int i=0; i<_logCPUs; i++) {
00428         int partnerIndex = myIndex ^ mask;
00429         int partner = order[partnerIndex];
00430         if ((myIndex % mask == 0) && (partner < _nrCPUs)) {
00431             if (myIndex > partnerIndex) {
00432                 MPI_Send(&result, 1, elem,
00433                          partner, RDUCE_TAG, MPI_COMM_WORLD);
00434             } else {
00435                 ArithT recvVal;
00436                 MPI_Recv(&recvVal, 1, elem,
00437                          partner, RDUCE_TAG, MPI_COMM_WORLD, &stat);
00438                 redOp.DoIt(result, recvVal);
00439             }
00440         }
00441         mask <<= 1;
00442     }
00443     MPI_Type_free(&elem);
00444     delete order;
00445     return result;
00446 }

Here is the call graph for this function:


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