Mentions légales du service

Skip to content
Snippets Groups Projects
Commit b867235a authored by Quentin Khan's avatar Quentin Khan
Browse files

FFmmAlgorithmThreadBalanced L2L done

parent 726c803b
No related branches found
No related tags found
No related merge requests found
...@@ -447,38 +447,56 @@ protected: ...@@ -447,38 +447,56 @@ protected:
FLOG(FTic counterTime); FLOG(FTic counterTime);
FLOG(FTic computationCounter); FLOG(FTic computationCounter);
typename OctreeClass::Iterator octreeIterator(tree); TreeIterator octreeIterator(tree);
octreeIterator.moveDown(); octreeIterator.moveDown();
for(int idxLevel = 2 ; idxLevel < FAbstractAlgorithm::upperWorkingLevel ; ++idxLevel){ for(int idxLevel = 2 ; idxLevel < FAbstractAlgorithm::upperWorkingLevel ; ++idxLevel){
octreeIterator.moveDown(); octreeIterator.moveDown();
} }
typename OctreeClass::Iterator avoidGotoLeftIterator(octreeIterator); TreeIterator avoidGotoLeftIterator(octreeIterator);
const int heightMinusOne = FAbstractAlgorithm::lowerWorkingLevel - 1; const int heightMinusOne = FAbstractAlgorithm::lowerWorkingLevel - 1;
// for each levels excepted leaf level // for each levels excepted leaf level
for(int idxLevel = FAbstractAlgorithm::upperWorkingLevel ; idxLevel < heightMinusOne ; ++idxLevel ){ for(int idxLevel = FAbstractAlgorithm::upperWorkingLevel ;
idxLevel < heightMinusOne ;
++idxLevel )
{
FLOG(FTic counterTimeLevel); FLOG(FTic counterTimeLevel);
int numberOfCells = 0;
// for each cells std::vector< std::pair<TreeIterator, int> > iterVector;
do{ // Find iterators to leaf portion of each zone.
iterArray[numberOfCells] = octreeIterator; for( std::vector<ZoneBoundClass> zone : costzones ) {
++numberOfCells; iterVector.push_back(
} while(octreeIterator.moveRight()); std::pair<TreeIterator,int>(
avoidGotoLeftIterator.moveDown(); octreeIterator, // Iterator to the current cell
octreeIterator = avoidGotoLeftIterator; zone[idxLevel].second)); // Cell count in zone
// Get iterator to end of zone (which is the first of the next zone)
for( int idx = 0; idx < zone[idxLevel].second; idx++) {
octreeIterator.moveRight();
}
}
octreeIterator.gotoLeft();
octreeIterator.moveDown();
FLOG(computationCounter.tic()); FLOG(computationCounter.tic());
const int chunkSize = FMath::Max(1 , numberOfCells/(omp_get_max_threads()*omp_get_max_threads()));
#pragma omp parallel #pragma omp parallel
{ {
KernelClass * const myThreadkernels = kernels[omp_get_thread_num()]; const int threadNum = omp_get_thread_num();
#pragma omp for nowait schedule(dynamic, chunkSize) KernelClass * const myThreadkernels = kernels[threadNum];
for(int idxCell = 0 ; idxCell < numberOfCells ; ++idxCell){ TreeIterator zoneIterator = iterVector[threadNum].first;
myThreadkernels->L2L( iterArray[idxCell].getCurrentCell() , iterArray[idxCell].getCurrentChild(), idxLevel); int zoneCellCount = iterVector[threadNum].second;
while( zoneCellCount-- > 0 ) {
myThreadkernels->L2L(
zoneIterator.getCurrentCell(),
zoneIterator.getCurrentChild(),
idxLevel);
zoneIterator.moveRight();
} }
} }
FLOG(computationCounter.tac()); FLOG(computationCounter.tac());
FLOG( FLog::Controller << "\t\t>> Level " << idxLevel << " = " << counterTimeLevel.tacAndElapsed() << "s\n" ); FLOG( FLog::Controller << "\t\t>> Level " << idxLevel << " = " << counterTimeLevel.tacAndElapsed() << "s\n" );
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment