FiniteVolumeGPU/shmemTesting.py

117 lines
3.1 KiB
Python

# -*- 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 <http://www.gnu.org/licenses/>.
"""
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)