From aa2ac201856c43b8b17bbba2cc9f2aa9d1434e2d Mon Sep 17 00:00:00 2001 From: Giovanni La Mura <giovanni.lamura@inaf.it> Date: Fri, 23 Feb 2024 12:48:39 +0100 Subject: [PATCH] Implement calculation of memory requirements for trapping --- src/include/tfrfme.h | 29 +++++++++++++++++++++++++++++ src/libnptm/tfrfme.cpp | 24 ++++++++++++++++++++++++ src/make.inc | 4 ++-- src/trapping/cfrfme.cpp | 14 ++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/include/tfrfme.h b/src/include/tfrfme.h index 9230e72c..8e92f7af 100644 --- a/src/include/tfrfme.h +++ b/src/include/tfrfme.h @@ -69,6 +69,13 @@ public: */ std::complex<double> get_element(int index) { return wk[index]; } + /*! \brief Calculate the necessary amount of memory to create a new instance. + * + * \param lm: `int` Maximum field expansion order. + * \return size: `long` The necessary memory size in bytes. + */ + static long get_memory_requirement(int lm); + /*! \brief Set an element in the WK vector. * * \param index: `int` Index of the desired element. @@ -185,6 +192,13 @@ public: */ double get_matrix_element(int row, int col) { return vkzm[row][col]; } + /*! \brief Calculate the necessary amount of memory to create a new instance. + * + * \param _nkv: `int` Number of radial vector coordinates. QUESTION: correct? + * \return size: `long` The necessary memory size in bytes. + */ + static long get_memory_requirement(int _nkv); + /*! \brief Get a parameter by its name. * * \param param_name: `string` Name of the parameter. @@ -349,6 +363,21 @@ public: */ std::complex<double> get_matrix_element(int row, int col); + /*! \brief Calculate the necessary amount of memory to create a new instance. + * + * \param _lmode: `int` Order expansion mode flag. + * \param _lm: `int` Maximum field expansion order. + * \param _nkv: `int` Number of radial vector coordinates. QUESTION: correct? + * \param _nxv: `int` Number of computed X coordinates. + * \param _nyv: `int` Number of computed Y coordinates. + * \param _nzv: `int` Number of computed Z coordinates. + * \return size: `long` The necessary memory size in bytes. + */ + static long get_memory_requirement( + int _lmode, int _lm, int _nkv, int _nxv, + int _nyv, int _nzv + ); + /*! \brief Get a configuration parameter. * * \param param_name: `string` Name of the parameter. diff --git a/src/libnptm/tfrfme.cpp b/src/libnptm/tfrfme.cpp index b126bbc7..df4f435e 100644 --- a/src/libnptm/tfrfme.cpp +++ b/src/libnptm/tfrfme.cpp @@ -97,6 +97,12 @@ Swap1* Swap1::from_legacy(string file_name) { return instance; } +long Swap1::get_memory_requirement(int lm) { + long size = (long)sizeof(int); + size += (long)(sizeof(complex<double>) * 2 * lm * (lm + 2)); + return size; +} + void Swap1::write_binary(string file_name, string mode) { if (mode.compare("LEGACY") == 0) { write_legacy(file_name); @@ -302,6 +308,12 @@ Swap2* Swap2::from_legacy(string file_name) { return instance; } +long Swap2::get_memory_requirement(int _nkv) { + long size = (long)(3 * sizeof(int) + 11 * sizeof(double)); + size += (long)(sizeof(double) * _nkv * (_nkv + 1)); + return size; +} + double Swap2::get_param(string param_name) { double value; if (param_name.compare("nkv") == 0) value = 1.0 * nkv; @@ -711,6 +723,18 @@ std::complex<double> TFRFME::get_matrix_element(int row, int col) { return wsum[row][col]; } +long TFRFME::get_memory_requirement( + int _lmode, int _lm, int _nkv, int _nxv, + int _nyv, int _nzv +) { + int _nlmmt = 2 * _lm * (_lm + 2); + int _nrvc = _nxv * _nyv * _nzv; + long size = (long)(8 * sizeof(int) + 8 * sizeof(double)); + size += (long)((_nxv + _nyv + _nzv) * sizeof(double)); + size += (long)(_nlmmt * _nrvc * sizeof(complex<double>)); + return size; +} + double TFRFME::get_param(string param_name) { double value; if (param_name.compare("vk") == 0) value = vk; diff --git a/src/make.inc b/src/make.inc index c56fd133..dcdd896f 100644 --- a/src/make.inc +++ b/src/make.inc @@ -40,8 +40,8 @@ endif # CXXFLAGS defines the default compilation options for the C++ compiler ifndef CXXFLAGS -#override CXXFLAGS=-O0 -ggdb -pg -coverage -I$(HDF5_INCLUDE) -override CXXFLAGS=-O3 -I$(HDF5_INCLUDE) +override CXXFLAGS=-O3 -ggdb -pg -coverage -I$(HDF5_INCLUDE) +#override CXXFLAGS=-O3 -I$(HDF5_INCLUDE) endif # HDF5_LIB defines the default path to the HDF5 libraries to use diff --git a/src/trapping/cfrfme.cpp b/src/trapping/cfrfme.cpp index b99dd02d..79c68e35 100644 --- a/src/trapping/cfrfme.cpp +++ b/src/trapping/cfrfme.cpp @@ -225,6 +225,15 @@ void frfme(string data_file, string output_path) { /*vkv = new double[nkv](); vkzm = new double*[nkv]; for (int vi = 0; vi < nkv; vi++) vkzm[vi] = new double[nkv];*/ + long swap1_size, swap2_size, tfrfme_size; + double size_mb; + printf("INFO: calculation memory requirements\n"); + swap1_size = Swap1::get_memory_requirement(lm); + size_mb = 1.0 * swap1_size / 1024.0 / 1024.0; + printf("Swap 1: %.2lg MB\n", size_mb); + swap2_size = Swap2::get_memory_requirement(nkv); + size_mb = 1.0 * swap2_size / 1024.0 / 1024.0; + printf("Swap 2: %.2lg MB\n", size_mb); tt2 = new Swap2(nkv); // End of array initialization double vkm = vk * exri; @@ -243,6 +252,11 @@ void frfme(string data_file, string output_path) { int nzs = nzsh * 2; int nzv = nzs + 1; int nzshpo = nzsh + 1; + tfrfme_size = TFRFME::get_memory_requirement(lmode, lm, nkv, nxv, nyv, nzv); + size_mb = 1.0 * tfrfme_size / 1024.0 / 1024.0; + printf("TFRFME: %.2lg MB\n", size_mb); + size_mb = 1.0 * (swap1_size + swap2_size + tfrfme_size) / 1024.0 / 1024.0; + printf("TOTAL: %.2lg MB\n", size_mb); tfrfme = new TFRFME(lmode, lm, nkv, nxv, nyv, nzv); for (int i24 = nxshpo; i24 <= nxs; i24++) { tfrfme->set_x(i24, tfrfme->get_x(i24 - 1) + delxyz); -- GitLab