// return -1 when not supported int numUniqNodes() { #if 0 if (numNodes != 0) return numNodes; int n = 0; for (int i=0; i<CmiNumPes(); i++) if (nodeIDs[i] > n) n = nodeIDs[i]; numNodes = n+1; return numNodes; #else if (numNodes > 0) return numNodes; // already calculated CkVec<int> unodes; int i; for (i=0; i<numPes; i++) unodes.push_back(nodeIDs[i]); //unodes.bubbleSort(0, numPes-1); unodes.quickSort(); int last = -1; std::map<int, int> nodemap; // nodeIDs can be out of range of [0,numNodes] for (i=0; i<numPes; i++) { if (unodes[i] != last) { last=unodes[i]; nodemap[unodes[i]] = numNodes; numNodes++; } } if (numNodes == 0) { numNodes = CmiNumNodes(); numPes = CmiNumPes(); } else { // re-number nodeIDs, which may be necessary e.g. on BlueGene/P for (i=0; i<numPes; i++) nodeIDs[i] = nodemap[nodeIDs[i]]; CpuTopology::supported = 1; } return numNodes; #endif }