YGM - это асинхронная библиотека связи, предназначенная для нерегулярных моделей связи. Он построен на абстракции коммуникатора, очень похожий на MPI, но общение обрабатывается асинхронно и инициируется отправителями без какого -либо взаимодействия с приемниками. Особенности YGM
async вызова. Эта функция будет выполнена в ранге назначения в неустановленное время в будущем, но YGM явно не дает отправителю осведомляться об этом завершении.for_all , которые выполняют предоставленную пользователем функцию на каждом хранимом объекте, или, когда известна конкретная часть местоположения данных, операции visit -типа, которые выполняют предоставленную пользователем функцию только на желаемых данных. Эти контейнеры найдены здесь.YGM-это библиотека только для заголовков, которую легко включить в проект через Cmake. Добавление следующего в cmakelists.txt установит YGM и его зависимости как часть вашего проекта:
set(DESIRED_YGM_VERSION 0.4)
find_package(ygm ${DESIRED_YGM_VERSION} CONFIG)
if (NOT ygm_FOUND)
FetchContent_Declare(
ygm
GIT_REPOSITORY https://github.com/LLNL/ygm
GIT_TAG v${DESIRED_YGM_VERSION}
)
FetchContent_GetProperties(ygm)
if (ygm_POPULATED)
message(STATUS "Found already populated ygm dependency: "
${ygm_SOURCE_DIR}
)
else ()
set(JUST_INSTALL_YGM ON)
set(YGM_INSTALL ON)
FetchContent_Populate(ygm)
add_subdirectory(${ygm_SOURCE_DIR} ${ygm_BINARY_DIR})
message(STATUS "Cloned ygm dependency " ${ygm_SOURCE_DIR})
endif ()
else ()
message(STATUS "Found installed ygm dependency " ${ygm_DIR})
endif ()
Здесь мы пройдемся по базовой программе YGM «Hello World». Справочник примеров содержит несколько других примеров, в том числе многие, использующие контейнеры для хранения YGM.
Для начала необходимы заголовки для коммуникатора YGM
# include < ygm/comm.hpp > В начале программы должен быть построен коммуникатор YGM. Он будет предоставлен argc и argv как MPI_Init , и у него есть необязательный третий аргумент, который указывает агрегатный размер (в байтах), разрешенный для всех буферов отправки до того, как YGM начнет промыть отправки. Здесь мы сделаем буфер с 32 МБ заполненного буферного пространства.
ygm::comm world (&argc, &argv, 32 * 1024 * 1024 );Затем нам нужна лямбда, чтобы отправить через YGM. Мы сделаем простой тип hello_world Lambda.
auto hello_world_lambda = []( const std::string &name) {
std::cout << " Hello " << name << std::endl;
}; Наконец, мы используем эту лямбду внутри наших async вызовов. В этом случае у нас будет ранг 0 отправить сообщение на первое место, сказав ему приветствовать мир
if (world.rank0()) {
world. async ( 1 , hello_world_lambda, std::string ( " world " ));
}Полная, компилируемая версия этого примера найдена здесь. Запуск его печатает один "Hello World".
Существует два разных класса Lambdas, которые могут быть переданы YGM: удаленные лямбдас и локальные лямбдас , каждый из которых имеет разные требования.
Удаленная лямбда - это любая лямбда, которая потенциально может быть выполнена на другом ранге. Эти Lambdas идентифицируются как те, которые предоставляются ygm::comm или любые контейнеры для хранения через функцию, префиксированную async_ .
Определяющая особенность удаленных лямбдов заключается в том, что они не должны захватывать каких -либо переменных; Все переменные должны быть предоставлены в качестве аргументов. Это ограничение связано с отсутствием способности YGM осматривать и извлекать эти аргументы, когда сериализация сообщений будет отправлено в другие ряды.
Местная Lambda - это любая лямбда, которая гарантированно не отправляется в удаленный ранг. Эти Lambdas идентифицируются как те, которые предоставляются для операции for_all на контейнере для хранения.
Определяющая особенность локальных лямбдов заключается в том, что все аргументы, помимо того, что хранятся в контейнере, должны быть захвачены. Внутренне, эти лямбдас могут быть переданы std::for_each , который итерации над элементами контейнера, хранящиеся локально на каждом ранении.
YGM распределен по лицензии MIT.
Все новые взносы должны быть сделаны по лицензии MIT.
См. Лицензию, уведомление и авторское право для получения подробной информации.
SPDX-LICENSE-Идентификатор: MIT
Llnl-Code-789122