diff --git a/src/core/MemoryUsage.cpp b/src/core/MemoryUsage.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fc784321714f6f50df6fcf00d833fd4b500cbe8c --- /dev/null +++ b/src/core/MemoryUsage.cpp @@ -0,0 +1,56 @@ +//====================================================================================================================== +// +// This file is part of waLBerla. waLBerla is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// waLBerla is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file MemoryUsage.cpp +//! \author Sebastian Eibl <sebastian.eibl@fau.de> +// +//====================================================================================================================== + +#include "MemoryUsage.h" + +#ifdef __linux__ +#include <sys/resource.h> +#endif +#include "waLBerlaDefinitions.h" +#include "core/logging/Logging.h" +#include "core/math/Sample.h" + +namespace walberla { + +long getResidentMemorySize() +{ +#ifdef __linux__ + struct rusage usage; + int gru = getrusage(RUSAGE_SELF, &usage); + + if (gru!=0) + WALBERLA_LOG_WARNING("There was an error getting memory statistics!"); + + return usage.ru_maxrss; +#else + WALBERLA_LOG_WARNING("Getting memory statistics is currently not supported on non-Linux systems!"); + return 0; +#endif +} + +void printResidentMemoryStatistics() +{ + math::Sample memory; + memory.castToRealAndInsert(getResidentMemorySize()); + memory.mpiGatherRoot(); + WALBERLA_LOG_INFO_ON_ROOT("resident memory: " << memory.format()); +} + +} // namespace walberla diff --git a/src/core/MemoryUsage.h b/src/core/MemoryUsage.h new file mode 100644 index 0000000000000000000000000000000000000000..c1775f6a2c85dfb22363de4124c76bfd76dff260 --- /dev/null +++ b/src/core/MemoryUsage.h @@ -0,0 +1,39 @@ +//====================================================================================================================== +// +// This file is part of waLBerla. waLBerla is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// waLBerla is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file MemoryUsage.h +//! \author Sebastian Eibl <sebastian.eibl@fau.de> +// +//====================================================================================================================== + +#pragma once + +#include <string> + +namespace walberla { + +/** + * @return The current resident memory size of the calling process in kilobytes. + */ +long getResidentMemorySize(); + +/** + * Determines memory usage on all MPI processes and prints statistics. Output + * is in kilobytes. + * \attention uses mpi gather operation + */ +void printResidentMemoryStatistics(); + +} // namespace walberla diff --git a/tests/core/CMakeLists.txt b/tests/core/CMakeLists.txt index 4d58647b8a563af3a86f01183f226136f835427f..72b8e4537f2c9b7fa1e4c0dfc4bf89db6db682cb 100644 --- a/tests/core/CMakeLists.txt +++ b/tests/core/CMakeLists.txt @@ -194,6 +194,9 @@ waLBerla_execute_test( NAME FunctionTraitsTest ) waLBerla_compile_test( FILES GridGeneratorTest.cpp ) waLBerla_execute_test( NAME GridGeneratorTest ) +waLBerla_compile_test( FILES MemoryUsage.cpp ) +waLBerla_execute_test( NAME MemoryUsage ) + waLBerla_compile_test( FILES OpenMPWrapperTest.cpp ) waLBerla_execute_test( NAME OpenMPWrapperTest ) diff --git a/tests/core/MemoryUsage.cpp b/tests/core/MemoryUsage.cpp new file mode 100644 index 0000000000000000000000000000000000000000..70352d92b30fd4156a05895a51c961b6fd815abe --- /dev/null +++ b/tests/core/MemoryUsage.cpp @@ -0,0 +1,49 @@ +//====================================================================================================================== +// +// This file is part of waLBerla. waLBerla is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// waLBerla is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file MemoryUsage.cpp +//! \author Sebastian Eibl <sebastian.eibl@fau.de> +// +//====================================================================================================================== + +#include "core/Environment.h" +#include "core/MemoryUsage.h" +#include "core/debug/CheckFunctions.h" +#include "core/debug/TestSubsystem.h" +#include "core/logging/Logging.h" + +#include <vector> + +using namespace walberla; + +int main( int argc, char** argv ) +{ + Environment env(argc, argv); + WALBERLA_UNUSED(env); + debug::enterTestMode(); + + std::vector<int> stuff(200*1024*1024/sizeof(int),1); + + auto memSize = getResidentMemorySize(); +#ifdef __linux__ + WALBERLA_CHECK_GREATER(memSize, 200000); + WALBERLA_CHECK_LESS (memSize, 250000); +#else + WALBERLA_CHECK_EQUAL(memSize, 0); +#endif + printResidentMemoryStatistics(); + WALBERLA_LOG_DEVEL(stuff[0]); //make sure stuff is not optimized + return EXIT_SUCCESS; +}