YGM adalah perpustakaan komunikasi asinkron yang dirancang untuk pola komunikasi yang tidak teratur. Ini dibangun di atas abstraksi komunikator, seperti MPI, tetapi komunikasi ditangani secara tidak sinkron dan diprakarsai oleh pengirim tanpa interaksi dengan penerima. Fitur YGM
async . Fungsi ini akan selesai pada peringkat tujuan pada waktu yang tidak ditentukan di masa depan, tetapi YGM tidak secara eksplisit membuat pengirim sadar akan penyelesaian ini.for_all Collective yang menjalankan fungsi yang disediakan pengguna pada setiap objek yang disimpan, atau, ketika bagian tertentu dari lokasi data diketahui, operasi visit -tipe yang melakukan fungsi yang disediakan pengguna hanya pada data yang diinginkan. Wadah ini ditemukan di sini.YGM adalah perpustakaan header saja yang mudah dimasukkan ke dalam proyek melalui CMake. Menambahkan yang berikut ini ke cmakelists.txt akan menginstal YGM dan ketergantungannya sebagai bagian dari proyek Anda:
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 ()
Di sini kita akan berjalan melalui program YGM "Hello World" dasar. Direktori Contoh berisi beberapa contoh lainnya, termasuk banyak yang menggunakan wadah penyimpanan YGM.
Untuk memulai, header untuk komunikator YGM diperlukan
# include < ygm/comm.hpp > Pada awal program, komunikator YGM harus dibangun. Ini akan diberikan argc dan argv seperti MPI_Init , dan memiliki argumen ketiga opsional yang menentukan ukuran agregat (dalam byte) diizinkan untuk semua buffer pengiriman sebelum YGM mulai menyiram pengiriman. Di sini, kami akan membuat buffer dengan 32MB ruang buffer kirim agregat.
ygm::comm world (&argc, &argv, 32 * 1024 * 1024 );Selanjutnya, kita membutuhkan lambda untuk dikirim melalui YGM. Kami akan melakukan jenis lambda hello_world sederhana.
auto hello_world_lambda = []( const std::string &name) {
std::cout << " Hello " << name << std::endl;
}; Akhirnya, kami menggunakan lambda ini di dalam panggilan async kami. Dalam hal ini, kita akan memiliki peringkat 0 mengirim pesan ke peringkat 1, mengatakannya untuk menyambut dunia
if (world.rank0()) {
world. async ( 1 , hello_world_lambda, std::string ( " world " ));
}Versi lengkap yang dapat dikompilasi dari contoh ini ditemukan di sini. Menjalankannya mencetak satu "Hello World".
Ada dua kelas lambdas yang berbeda yang dapat diberikan kepada YGM: Lambdas jarak jauh dan lambda lokal , yang masing -masing memiliki persyaratan berbeda.
Lambda jarak jauh adalah lambda yang berpotensi dieksekusi pada peringkat yang berbeda. Lambdas ini diidentifikasi sebagai yang diberikan kepada ygm::comm atau salah satu wadah penyimpanan melalui fungsi yang diawali dengan async_ .
Fitur penentu lambdas jarak jauh adalah mereka tidak boleh menangkap variabel apa pun; Semua variabel harus disediakan sebagai argumen. Keterbatasan ini disebabkan oleh kurangnya kemampuan YGM untuk memeriksa dan mengekstrak argumen ini ketika membuat serial pesan untuk dikirim ke peringkat lain.
Lambda lokal adalah lambda yang dijamin tidak akan dikirim ke peringkat jarak jauh. Lambdas ini diidentifikasi sebagai yang diberikan pada operasi for_all pada wadah penyimpanan.
Fitur yang menentukan lambdas lokal adalah bahwa semua argumen selain apa yang disimpan dalam wadah harus ditangkap. Secara internal, lambdas ini dapat diberikan kepada std::for_each yang mengulangi elemen wadah yang disimpan secara lokal di setiap peringkat.
YGM didistribusikan di bawah lisensi MIT.
Semua kontribusi baru harus dilakukan di bawah lisensi MIT.
Lihat lisensi-mit, pemberitahuan, dan hak cipta untuk detailnya.
SPDX-LICENSE-Identifier: MIT
Llnl-code-789122