diff --git a/c_utils/memusage.c b/c_utils/memusage.c new file mode 100644 index 0000000..7d7ac52 --- /dev/null +++ b/c_utils/memusage.c @@ -0,0 +1,68 @@ +/* + * This file is part of libc_utils. + * + * libc_utils 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 2 of the License, or + * (at your option) any later version. + * + * libc_utils 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 libc_utils; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * libc_utils is being developed at the Max-Planck-Institut fuer Astrophysik + * and financially supported by the Deutsches Zentrum fuer Luft- und Raumfahrt + * (DLR). + */ + +/* + * Functionality for measuring memory consumption + * + * Copyright (C) 2012 Max-Planck-Society + * Author: Martin Reinecke + */ +#define _GNU_SOURCE + +#include +#include +#include "memusage.h" + +double residentSetSize(void) + { + FILE *statm = fopen("/proc/self/statm","r"); + double res; + if (!statm) return -1.0; + fscanf(statm,"%*f %lf",&res); + fclose(statm); + return (res*4096); + } + +double VmHWM(void) + { + char word[1024]; + FILE *f = fopen("/proc/self/status", "r"); + double res; + if (!f) return -1.0; + while(1) + { + if (fscanf (f,"%1023s",word)<0) + { fclose(f); return -1.0; } + if (!strncmp(word, "VmHWM:", 6)) + { + fscanf(f,"%lf",&res); + fscanf(f,"%2s",word); + if (strncmp(word, "kB", 2)) + { fclose(f); return -1.0; } + res *=1024; + fclose(f); + return res; + } + } + } diff --git a/c_utils/memusage.h b/c_utils/memusage.h new file mode 100644 index 0000000..cc11bd1 --- /dev/null +++ b/c_utils/memusage.h @@ -0,0 +1,51 @@ +/* + * This file is part of libc_utils. + * + * libc_utils 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 2 of the License, or + * (at your option) any later version. + * + * libc_utils 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 libc_utils; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * libc_utils is being developed at the Max-Planck-Institut fuer Astrophysik + * and financially supported by the Deutsches Zentrum fuer Luft- und Raumfahrt + * (DLR). + */ + +/*! \file memusage.h + * Functionality for measuring memory consumption + * + * Copyright (C) 2012 Max-Planck-Society + * \author Martin Reinecke + */ + +#ifndef PLANCK_WALLTIME_C_H +#define PLANCK_WALLTIME_C_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Returns the current resident set size in bytes. + \note Currently only supported on Linux. Returns -1 if unsupported. */ +double residentSetSize(void); + +/*! Returns the high water mark of the resident set size in bytes. + \note Currently only supported on Linux. Returns -1 if unsupported. */ +double VmHWM(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/c_utils/planck.make b/c_utils/planck.make index f4a2d30..4f0ccb1 100644 --- a/c_utils/planck.make +++ b/c_utils/planck.make @@ -8,7 +8,7 @@ FULL_INCLUDE+= -I$(SD) HDR_$(PKG):=$(SD)/*.h LIB_$(PKG):=$(LIBDIR)/libc_utils.a -OBJ:=c_utils.o walltime_c.o +OBJ:=c_utils.o walltime_c.o memusage.o OBJ:=$(OBJ:%=$(OD)/%) $(OBJ): $(HDR_$(PKG)) | $(OD)_mkdir diff --git a/libsharp/sharp_test.c b/libsharp/sharp_test.c index a0b192c..8f9c86c 100644 --- a/libsharp/sharp_test.c +++ b/libsharp/sharp_test.c @@ -61,6 +61,7 @@ #include "c_utils.h" #include "sharp_announce.h" #include "sharp_core.h" +#include "memusage.h" typedef complex double dcmplx; @@ -239,6 +240,8 @@ int main(int argc, char **argv) else UTIL_FAIL("unknown grid geometry"); +printf("\nMemory high water mark: %.2f MB\n",VmHWM()/(1<<20)); + #ifdef USE_MPI MPI_Finalize(); #endif