GithubHelp home page GithubHelp logo

ocean_model_arch's Introduction

The shallow water model, formulated from the ocean general circulation sigma model INMOM (Institute of Numerical Mathematics Ocean Model).

Using modern Fortran (2003 at least).

Structure:

control         - Algorithm Layer       : work with grid_type and ocean_type

core, interface - Interface Layer       : data types and transfer data to kernel (core/kernel_interface.f90 - main envokes for kernels)

kernel          - Kernel Layer          : work with 1D, 2D and 3D fortran arrays, per one block

gpu             - Kernel and Algorithm Layers for CUDA

macros          - Main configuration for model (OpenMP modes, MPI, GPU)

service   - Specific utills (grid and mask construction, etc)

shared    - Common utills (MPI, etc)

configs   - Common configs

tools     - Shell for legacy

legacy    - Original code from INMOM

I/O, Time Manager, Configs - from ocean model INMOM

mpp_macros.fi:

#define _MPP_KERNEL_TIMER_ON_
    Опция меряет время выполнения ядер каждым потоком. У каждого потока прописывается id по имени, функция get_kernel_id(). Функционал старый и больше не поддерживается. Соответственно может не работать на данный момент.
#define _MPP_SORTED_BLOCKS_
    Опция включает сортировку блоков по их весу. В перечислении do k = 1, domain%bcount идут сначала номера блоков с большим весом. Опция полезна при распараллеливании по потокам: в перечислении блоков используется директива !$omp do private(k) schedule(static, 1) и потоки разбирают блоки с большей загруженностью, что обеспечивает балансировку нагрузки по потокам. Опция была протестирована, прирост в производительности есть.
#define _MPP_NO_PARALLEL_MODE_
    Опция отключает распараллеливание по потокам. За исключением пересылок в MPI.
#define _MPP_BLOCK_MODE_
    Опция включает распараллеливание по потокам в режиме task-based. Основной режим распараллеливания по потокам. Каждому потоку ставится в соответствие набор блоков для вычисления. Пересылки в MPI также распараллелены. Особое внимание уделяется first-touch policy и целостность кэшей в NUMA системах. Правда, ускорение на NUMA системах работает не стабильно, возможно потому что нужно сбрасывать кэши перед началом расчета, чтобы при инициализации данных память закреплялась. Также, нету закрепления потоков в коде, предполагается использовать OMP_PINNED (?). TODO: configs from cluster.
#define _MPP_HYBRID_BLOCK_MODE_
    Не работает. Работает как _MPP_BLOCK_MODE_, но без синхронизаций MPI. Есть основа для перекрытия вычислений/синхронизаций, но пока не реализовано. Были попытки реализации, но наблюдалось только замедление (может из-за малого размера системы). Поэтому сейчас полностью выкинуто из текущей версии кода.
#define _MPP_MAX_SIMUL_SYNCS_
    Количество одновременных пересылок данных. Например, идея одновременно пересылать поле скоростей и поле уровня. Опция нужна при работе _MPP_HYBRID_BLOCK_MODE_, т.к. там идет отдельная пересылка границы и внутренних точек и действительно есть возможность пересылать некоторые поля одновременно. Сейчас не поддержано. Задет только размеры буфферов в MPI, но значение отличное от 1 ставить нету смысла.
#define _DBG_MEM_PROFILE_
    Опция включает профилирование по памяти. При каждом вызове init_data* внутри считается количество выделяемой памяти.
#define _DBG_TIME_PROFILE_
    Опция включает профилирование по времени. Перед и после каждой кртически важной по производительности секции кода добавляются глобальные синхронизации. Поэтому с этой опцией ожидается замедление, но происходит более точная профилировка по времени всех частей кода.
#define _GPU_MODE_
    Общая опция для включения GPU расчета. Инициализируется память на девайсе, включается код под графические процессоры (компилировать нужно уже с помощью nvfortran). Без модификаторов опция работает как GPU + MPI, т.е. с пересылками между девайсом и хостом. На каждый блок вызывается свое CUDA ядро со своим stream потоком.
#define _GPU_FULL_
    Модификатор к опции _GPU_MODE_. Включает расчет полностью на GPU без синхронизаций с CPU. Все данные всегда на GPU.
#define _GPU_ASYNC_
    Модификатор к опции _GPU_MODE_. Включает асихронную пересылку данных между хостом и девайсом. Опция имеет смысл при использовании больше одного блока на процесс. В таком случае на современных видеокартах можно наблюдать перекрытие вычислений CUDA ядер с операциями копирования с хоста на девайс и обратно.
#define _GPU_CPU_HETERO_
    Модификатор к опции _GPU_MODE_. Полностью гетерогенные вычисления: часть блоков считается на GPU, часть на CPU. _CPU_GPU_RATIO_ задает соотношение. Опция больше не поддерживается, т.к. оказалась совсем неэффективной.
#define _GPU_MULTI_
    Расчет с несколькими GPU на одном узле. Важно указать кол-во блоков на узел равным кол-ву доступных GPU. Каждому блоку в расчете будет соответствовать своя GPU.

Configs:

sw.par:
    Возможность включать трасеры, перенос, диффузию. Задает физические параметры и т.д.
basin.par
    Возможность задавать сетку.
parallel.par
    Возможность задавать параллельную конфигурацию, блоки, виды разбиения на блоки и т.д.
ocean_run.par
    Задает шаг по времени, длительность расчета, запись результатов и т.д.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.