template<class ArithT, class RedOpT>
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:
|