bool operator()( T &v ) { v = (T)my_count.fetch_and_increment(); if ( (int)v < N ) return true; else return false; }
void operator () (const tbb::blocked_range<int> &range) const { int i; PARTITIONER partitioner; for (i=range.begin(); i<range.end(); i++) { //printf("Outer Loop Body[%d<=%d<%d]=[0,%d]\n", range.begin(), i, range.end(), degrees[currentLevelSet[i]]); #ifdef SEQUENTIAL_INNER for(int j=0; j<degrees[currentLevelSet[i]]; j++) { int oldGatek; int freshNode,currentEdge; currentEdge = vertices[currentLevelSet[i]]+j; // let's handle one edge #ifdef XBOFILE freshNode = edges[currentEdge][1]; // 0 RTM, value was prefetched #else freshNode = edges[currentEdge]; // 0 RTM, value was prefetched #endif oldGatek = -1; // test gatekeeper oldGatek = gatekeeper[freshNode].fetch_and_increment(); if (oldGatek == 0) { // destination vertex unvisited! // increment newLevelIndex atomically int myIndex = newLevelIndex.fetch_and_increment(); // store fresh node in new level newLevelSet[myIndex] = freshNode; level[freshNode] = currentLevel + 1; } // end if freshNode } #else tbb::parallel_for (tbb::blocked_range<int>(0,degrees[currentLevelSet[i]],INNER_GRAINSIZE), innerLoopBody(i), partitioner); #endif } }
void operator () (const tbb::blocked_range<int> &range) const { int j; for(j=range.begin(); j<range.end(); j++) { //printf("Inner Loop Body (x,y)=(%d,%d) where y in [%d,%d)\n", i,j,range.begin(), range.end() ); int oldGatek; int freshNode,currentEdge; currentEdge = vertices[currentLevelSet[i]]+j; // let's handle one edge #ifdef XBOFILE freshNode = edges[currentEdge][1]; // 0 RTM, value was prefetched #else freshNode = edges[currentEdge]; // 0 RTM, value was prefetched #endif oldGatek = -1; // test gatekeeper oldGatek = gatekeeper[freshNode].fetch_and_increment(); if (oldGatek == 0) { // destination vertex unvisited! // increment newLevelIndex atomically int myIndex = newLevelIndex.fetch_and_increment(); // store fresh node in new level newLevelSet[myIndex] = freshNode; level[freshNode] = currentLevel + 1; } // end if freshNode } // end for j }
bool nextTaskID(std::size_t &taskID) { taskID = counter.fetch_and_increment(); return taskID < NofAtom; }