From 16da43ef19034e885324299715ab4972b1a9d181 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 27 Sep 2013 18:55:15 +0000 Subject: Elbeem: Use pragma directive instead of overriding number of omp threads Global OpenMP threads override is not a good idea because this would affect all possible OpenMP blocks running at the same time as simulation. And that was actually a big on restoring number of threads: code needed to store current number of threads, not maximal one. --- intern/elbeem/intern/simulation_object.cpp | 12 +----------- intern/elbeem/intern/solver_interface.cpp | 11 ++++++++++- intern/elbeem/intern/solver_interface.h | 8 +++++++- intern/elbeem/intern/solver_main.cpp | 6 +++--- 4 files changed, 21 insertions(+), 16 deletions(-) (limited to 'intern/elbeem') diff --git a/intern/elbeem/intern/simulation_object.cpp b/intern/elbeem/intern/simulation_object.cpp index 9e98adfc734..99c3b170634 100644 --- a/intern/elbeem/intern/simulation_object.cpp +++ b/intern/elbeem/intern/simulation_object.cpp @@ -32,10 +32,6 @@ //! lbm factory functions LbmSolverInterface* createSolver(); -#if PARALLEL==1 -static int omp_threadcache; -#endif - /****************************************************************************** * Constructor *****************************************************************************/ @@ -71,10 +67,6 @@ SimulationObject::~SimulationObject() if(mpParam) delete mpParam; if(mpParts) delete mpParts; debMsgStd("SimulationObject",DM_MSG,"El'Beem Done!\n",10); -#if (PARALLEL == 1) - omp_set_num_threads(omp_threadcache); - printf("Resetting omp_threads to cached value %d \n", omp_threadcache); -#endif } @@ -185,9 +177,7 @@ int SimulationObject::initializeLbmSimulation(ntlRenderGlobals *glob) mpLbm->setSmoothing(1.0 * mpElbeemSettings->surfaceSmoothing, 1.0 * mpElbeemSettings->surfaceSmoothing); mpLbm->setIsoSubdivs(mpElbeemSettings->surfaceSubdivs); #if PARALLEL==1 - omp_threadcache = omp_get_max_threads(); - omp_set_num_threads(mpElbeemSettings->threads); - printf("Setting omp_threads to usersetting %d \n", mpElbeemSettings->threads); + mpLbm->setNumOMPThreads(mpElbeemSettings->threads); #endif mpLbm->setSizeX(mpElbeemSettings->resolutionxyz); mpLbm->setSizeY(mpElbeemSettings->resolutionxyz); diff --git a/intern/elbeem/intern/solver_interface.cpp b/intern/elbeem/intern/solver_interface.cpp index c3421fe1968..4284a56f2fd 100644 --- a/intern/elbeem/intern/solver_interface.cpp +++ b/intern/elbeem/intern/solver_interface.cpp @@ -64,7 +64,10 @@ LbmSolverInterface::LbmSolverInterface() : mCppfStage(0), mDumpRawText(false), mDumpRawBinary(false), - mDumpRawBinaryZip(true) + mDumpRawBinaryZip(true), +#if PARALLEL==1 + mNumOMPThreads(1) +#endif // PARALLEL==1 { #if ELBEEM_PLUGIN==1 if(gDebugLevel<=1) setSilent(true); @@ -670,6 +673,12 @@ void LbmSolverInterface::markedClearList() { mMarkedCells.clear(); } +#if PARALLEL==1 +void LbmSolverInterface::setNumOMPThreads(int num_threads) { + mNumOMPThreads = num_threads; +} +#endif // PARALLEL==1 + /*******************************************************************************/ /*! string helper functions */ /*******************************************************************************/ diff --git a/intern/elbeem/intern/solver_interface.h b/intern/elbeem/intern/solver_interface.h index 8f3181a307d..e25c59e2d50 100644 --- a/intern/elbeem/intern/solver_interface.h +++ b/intern/elbeem/intern/solver_interface.h @@ -452,7 +452,9 @@ class LbmSolverInterface CellIdentifierInterface* markedAdvanceCell(); void markedClearList(); - +#if PARALLEL==1 + void setNumOMPThreads(int num_threads); +#endif // PARALLEL==1 protected: /*! abort simulation on error... */ @@ -595,6 +597,10 @@ class LbmSolverInterface bool mDumpRawText; bool mDumpRawBinary; bool mDumpRawBinaryZip; + +#if PARALLEL==1 + int mNumOMPThreads; +#endif // PARALLEL==1 }; diff --git a/intern/elbeem/intern/solver_main.cpp b/intern/elbeem/intern/solver_main.cpp index 99278657fd9..46af6740cf1 100644 --- a/intern/elbeem/intern/solver_main.cpp +++ b/intern/elbeem/intern/solver_main.cpp @@ -378,7 +378,7 @@ LbmFsgrSolver::mainLoop(int lev) const int gridLoopBound=1; GRID_REGION_INIT(); #if PARALLEL==1 -#pragma omp parallel default(shared) \ +#pragma omp parallel default(shared) num_threads(mNumOMPThreads) \ reduction(+: \ calcCurrentMass,calcCurrentVolume, \ calcCellsFilled,calcCellsEmptied, \ @@ -1119,7 +1119,7 @@ LbmFsgrSolver::preinitGrids() GRID_REGION_INIT(); #if PARALLEL==1 -#pragma omp parallel default(shared) \ +#pragma omp parallel default(shared) num_threads(mNumOMPThreads) \ reduction(+: \ calcCurrentMass,calcCurrentVolume, \ calcCellsFilled,calcCellsEmptied, \ @@ -1156,7 +1156,7 @@ LbmFsgrSolver::standingFluidPreinit() GRID_REGION_INIT(); #if PARALLEL==1 -#pragma omp parallel default(shared) \ +#pragma omp parallel default(shared) num_threads(mNumOMPThreads) \ reduction(+: \ calcCurrentMass,calcCurrentVolume, \ calcCellsFilled,calcCellsEmptied, \ -- cgit v1.2.3