# -*- coding: utf-8 -*- """ This python module implements SHMEM (shared memory) simulations for benchmarking Copyright (C) 2020 Norwegian Meteorological Institute This program 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. This program 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 this program. If not, see . """ import numpy as np import gc import logging # Simulator engine etc from GPUSimulators import SHMEMSimulatorGroup from GPUSimulators.common import run_simulation from GPUSimulators.model import EE2DKP07Dimsplit from GPUSimulators.helpers import initial_conditions as IC #### # Initialize logging #### log_level_console = 20 log_level_file = 10 log_filename = 'shmem.log' logger = logging.getLogger('GPUSimulators') logger.setLevel(min(log_level_console, log_level_file)) ch = logging.StreamHandler() ch.setLevel(log_level_console) logger.addHandler(ch) logger.info(f"Console logger using level {logging.getLevelName(log_level_console)}") fh = logging.FileHandler(log_filename) formatter = logging.Formatter('%(asctime)s:%(name)s:%(levelname)s: %(message)s') fh.setFormatter(formatter) fh.setLevel(log_level_file) logger.addHandler(fh) logger.info(f"File logger using level {logging.getLevelName(log_level_file)} to {log_filename}") #### # Initialize SHMEM grid etc #### logger.info("Creating SHMEM grid") # XXX: need to explicitly set ngpus when testing on a single-GPU system grid = SHMEMSimulatorGroup.SHMEMGrid(ngpus=4) #### # Set initial conditions #### logger.info("Generating initial conditions") nx = 128 ny = 128 gamma = 1.4 # save_times = np.linspace(0, 0.01, 10) save_times = np.linspace(0, 10, 10) save_var_names = ['rho', 'rho_u', 'rho_v', 'E'] outfile = "shmem_out.nc" #### # Run simulation #### logger.info("Running simulation") sims = [] for i in range(grid.ngpus): arguments = IC.gen_kelvin_helmholtz(nx, ny, gamma, grid=grid, index=i) arguments['context'] = grid.cuda_contexts[i] arguments['theta'] = 1.2 sims.append(EE2DKP07Dimsplit(**arguments)) # sims[i] = SHMEMSimulator(i, local_sim, grid) # 1st attempt: no wrapper (per sim) arguments['sims'] = sims arguments['grid'] = grid # Helper function to create SHMEM simulator def gen_sim(sims, grid, **kwargs): # XXX: kwargs not used, since the simulators are already instantiated in the for-loop above sim = SHMEMSimulatorGroup.SHMEMSimulatorGroup(sims, grid) return sim outfile = run_simulation(gen_sim, arguments, outfile, save_times, save_var_names) #### # Clean shutdown #### sim = None local_sim = None cuda_context = None arguments = None logging.shutdown() gc.collect() #### # Print completion and exit #### print("Completed!") exit(0)