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 ()
ここでは、基本的な「Hello World」YGMプログラムを進めます。例ディレクトリには、YGMのストレージコンテナを使用している多くのなど、いくつかの他の例が含まれています。
まず、YGMコミュニケーターのヘッダーが必要です
# include < ygm/comm.hpp >プログラムの開始時に、YGMコミュニケーターを構築する必要があります。 MPI_Initようなargcとargvが与えられ、YGMが送信を洗い始める前にすべての送信バッファーに許可される集約サイズ(バイト)を指定するオプションの3番目の引数があります。ここでは、32MBの総送信バッファースペースを備えたバッファーを作成します。
ygm::comm world (&argc, &argv, 32 * 1024 * 1024 );次に、YGMを通過するためにラムダが必要です。ラムダのシンプルなhello_worldタイプを行います。
auto hello_world_lambda = []( const std::string &name) {
std::cout << " Hello " << name << std::endl;
};最後に、私たちは私たちのasync呼び出しの内側にこのラムダを使用します。この場合、ランク0にランク1にメッセージを送信し、世界に挨拶するように言っています
if (world.rank0()) {
world. async ( 1 , hello_world_lambda, std::string ( " world " ));
}この例の完全で編集可能なバージョンはここにあります。それを実行すると、単一の「Hello World」が印刷されます。
YGMに与えることができる2つの異なるクラスには、リモートラムダと地元のラムダがあり、それぞれに異なる要件があります。
リモートラムダは、異なるランクで実行される可能性があるラムダです。これらのラムダは、 async_が接頭する関数を介してygm::commまたはストレージコンテナに与えられたものとして識別されます。
リモートラムダの決定的な特徴は、変数をキャプチャしてはならないことです。すべての変数を引数として提供する必要があります。この制限は、YGMが他のランクに送信されるメッセージをシリアル化するときにこれらの引数を検査および抽出する能力の欠如によるものです。
地元のラムダは、リモートランクに送られないことが保証されているラムダです。これらのラムダは、ストレージコンテナのfor_all操作に与えられたものとして識別されます。
ローカルラムダの決定的な特徴は、コンテナに保存されているもの以外のすべての引数をキャプチャする必要があるということです。内部的には、これらのラムダは、各ランクに局所的に保存されているコンテナの要素を反復するstd::for_eachに与えられる場合があります。
YGMはMITライセンスの下で配布されます。
すべての新しい貢献は、MITライセンスの下で行う必要があります。
詳細については、ライセンスMIT、通知、および著作権を参照してください。
SPDX-License-Identifier:MIT
LLNL-CODE-789122