YGM ist eine asynchrone Kommunikationsbibliothek für unregelmäßige Kommunikationsmuster. Es basiert auf einer Kommunikatorabstraktion, ähnlich wie MPI, aber die Kommunikation wird asynchron behandelt und von Absendern ohne Interaktion mit Empfängern initiiert. YGM -Funktionen
async Aufruf. Diese Funktion wird in Zukunft auf dem Zielrang zu einer nicht spezifizierten Zeit erfolgen, aber YGM macht den Absender nicht explizit auf diese Fertigstellung aufmerksam.for_all -Operationen zugegriffen, die eine vom Benutzer bereitgestellte Funktion für jedes gespeicherte Objekt ausführen, oder wenn der Standort eines bestimmten Datenortes bekannt ist, visit Operationen vom Typ, die eine von Benutzer bereitgestellte Funktion nur für die gewünschten Daten ausführen. Diese Behälter finden sich hier.YGM ist eine Nur-Header-Bibliothek, die durch CMAKE einfach in ein Projekt integrieren kann. Das Hinzufügen von Cmakelists.txt wird Folgendes addieren. Er installiert YGM und seine Abhängigkeiten als Teil Ihres Projekts:
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 ()
Hier gehen wir durch ein einfaches YGM -Programm "Hello World". Das Beispielverzeichnis enthält mehrere andere Beispiele, darunter viele, die die Speicherbehälter von YGM verwenden.
Zunächst werden Header für einen YGM -Kommunikator benötigt
# include < ygm/comm.hpp > Zu Beginn des Programms muss ein YGM -Kommunikator gebaut werden. Es wird argc und argv wie MPI_Init gegeben, und es hat ein optionales drittes Argument, das die Gesamtgröße (in Bytes) angibt, die für alle Send -Puffer zulässig ist, bevor YGM beginnt, die Sendungen zu senden. Hier erstellen wir einen Puffer mit 32 MB aggregierter Send -Pufferraum.
ygm::comm world (&argc, &argv, 32 * 1024 * 1024 );Als nächstes brauchen wir ein Lambda, um YGM zu senden. Wir werden eine einfache Hello_World -Art von Lambda machen.
auto hello_world_lambda = []( const std::string &name) {
std::cout << " Hello " << name << std::endl;
}; Schließlich verwenden wir diese Lambda in unseren async Anrufen. In diesem Fall haben wir Rang 0 eine Nachricht an Rang 1 senden, um die Welt zu begrüßen
if (world.rank0()) {
world. async ( 1 , hello_world_lambda, std::string ( " world " ));
}Die vollständige, kompilierbare Version dieses Beispiels finden Sie hier. Das Ausführen druckt eine Single "Hello World".
Es gibt zwei verschiedene Klassen von Lambdas, die YGM gegeben werden können: Fernlambdas und lokale Lambdas , von denen jede unterschiedliche Anforderungen hat.
Ein Remote -Lambda ist ein Lambda, das möglicherweise auf einen anderen Rang ausgeführt werden kann. Diese Lambdas werden als diejenigen identifiziert, die einem ygm::comm oder einem der Speicherbehälter über eine von async_ vorangestellte Funktion gegeben wurden.
Das definierende Merkmal von Remote -Lambdas ist, dass sie keine Variablen erfassen dürfen . Alle Variablen müssen als Argumente bereitgestellt werden. Diese Einschränkung ist auf die mangelnde Fähigkeit von YGM zurückzuführen, diese Argumente zu inspizieren und zu extrahieren, wenn die Serialisierung von Nachrichten an andere Ränge gesendet werden.
Ein lokales Lambda ist ein Lambda, der garantiert nicht in einen entfernten Rang gesendet wird. Diese Lambdas werden als diejenigen identifiziert, die einem für einen for_all in einem Speicherbehälter verabreicht werden.
Das definierende Merkmal lokaler Lambdas ist, dass alle Argumente außer dem, was im Container gespeichert ist, erfasst werden müssen. Intern können diese Lambdas an einen std::for_each übergeben werden, der über die lokal auf jedem Rang gespeicherten Containerelemente iteriert.
YGM wird unter der MIT -Lizenz verteilt.
Alle neuen Beiträge müssen im Rahmen der MIT -Lizenz geleistet werden.
Weitere Informationen finden Sie unter Lizenz, Bekanntmachung und Urheberrecht.
SPDX-Lizenz-Identifikator: MIT
LLNL-Code-789122