diff --git a/Src/Base/AMReX_CArena.cpp b/Src/Base/AMReX_CArena.cpp index c47f8f5ed2..42987f47a8 100644 --- a/Src/Base/AMReX_CArena.cpp +++ b/Src/Base/AMReX_CArena.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #ifdef AMREX_TINY_PROFILING @@ -57,7 +58,11 @@ CArena::alloc_protected (std::size_t nbytes) } #endif - if (static_cast(m_used+nbytes) >= arena_info.release_threshold) { + if (static_cast(m_used+nbytes) >= arena_info.release_threshold +#ifdef AMREX_USE_GPU + && (MFIter::currentDepth() == 0) +#endif + ) { freeUnused_protected(); } @@ -393,7 +398,11 @@ CArena::hasFreeDeviceMemory (std::size_t sz) std::size_t nbytes = Arena::align(sz == 0 ? 1 : sz); - if (static_cast(m_used+nbytes) >= arena_info.release_threshold) { + if (static_cast(m_used+nbytes) >= arena_info.release_threshold +#ifdef AMREX_USE_GPU + && (MFIter::currentDepth() == 0) +#endif + ) { freeUnused_protected(); } diff --git a/Src/Base/AMReX_MFIter.H b/Src/Base/AMReX_MFIter.H index 7f0ca4d353..fd21b0ee7c 100644 --- a/Src/Base/AMReX_MFIter.H +++ b/Src/Base/AMReX_MFIter.H @@ -167,6 +167,8 @@ public: static int allowMultipleMFIters (int allow); + static int currentDepth (); + void Finalize (); protected: diff --git a/Src/Base/AMReX_MFIter.cpp b/Src/Base/AMReX_MFIter.cpp index f68ab9ce35..6eff80f6e7 100644 --- a/Src/Base/AMReX_MFIter.cpp +++ b/Src/Base/AMReX_MFIter.cpp @@ -17,6 +17,16 @@ MFIter::allowMultipleMFIters (int allow) return allow; } +int +MFIter::currentDepth () +{ +#ifdef AMREX_USE_OMP +#pragma omp atomic read +#endif + int r = MFIter::depth; + return r; +} + MFIter::MFIter (const FabArrayBase& fabarray_, unsigned char flags_) : @@ -222,13 +232,6 @@ MFIter::Finalize () // mark as invalid currentIndex = endIndex; -#ifdef AMREX_USE_OMP -#pragma omp master -#endif - { - depth = 0; - } - #ifdef BL_USE_TEAM if ( ! (flags & NoTeamBarrier) ) ParallelDescriptor::MyTeam().MemoryBarrier(); @@ -257,6 +260,13 @@ MFIter::Finalize () if (m_fa) { m_fa.reset(nullptr); } + +#ifdef AMREX_USE_OMP +#pragma omp single +#endif + { + depth = 0; + } } void