YGM是一個旨在不規則通信模式的異步通信庫。它建立在傳播器抽象的基礎上,就像MPI一樣,但是通信是異步處理的,並且是由發件人啟動的,而無需與接收器進行任何互動。 YGM功能
async調用在指定目標等級上執行的函數和函數參數。此功能將在將來在未指定的時間內完成目標等級,但是YGM並未明確使發件人意識到此完成。for_all操作訪問,該操作在每個存儲的對像上執行用戶提供的函數,或者,當知道特定數據的位置時, visit僅在所需數據上執行用戶提供功能的-Type操作。這些容器在這裡找到。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開始沖洗發送之前所有發送緩衝區允許的匯總大小(以字節為單位)。在這裡,我們將製作一個帶有32MB的聚合發送緩衝區空間的緩衝區。
ygm::comm world (&argc, &argv, 32 * 1024 * 1024 );接下來,我們需要一個lambda來發送YGM。我們將進行簡單的Hello_world類型的lambda。
auto hello_world_lambda = []( const std::string &name) {
std::cout << " Hello " << name << std::endl;
};最後,我們在async調用中使用此lambda。在這種情況下,我們將有排名0向等級1發送消息,並告訴它打招呼世界
if (world.rank0()) {
world. async ( 1 , hello_world_lambda, std::string ( " world " ));
}此處可以找到此示例的完整,可編譯的版本。運行它打印出一個“ Hello World”。
可以將兩種不同的lambdas類別提供給YGM:遠程蘭巴斯和本地lambdas ,每個Lambdas都有不同的要求。
遠程lambda是任何可能以不同等級執行的lambda。這些lambdas被確定為賦予ygm::comm或通過async_前綴的函數的任何存儲容器的lambdas。
遠程lambdas的定義特徵是它們不得捕獲任何變量。所有變量都必須作為參數提供。這種限制是由於YGM缺乏序列化消息將其發送到其他等級時檢查和提取這些參數的能力。
當地的lambda是任何保證不會將其發送到遠程排名的lambda。這些lambdas被確定為在存儲容器上使用for_all操作的那些。
本地lambdas的定義特徵是,除了存儲在容器中的內容外,所有參數都必須捕獲。在內部,可以將這些lambdas交給std::for_each ,該lambdas在每個等級上存儲在本地存儲的容器元素上。
YGM根據MIT許可分配。
所有新捐款必鬚根據MIT許可做出。
有關詳細信息,請參見許可-MIT,通知和版權。
SPDX-LICENSE-IDIFIER:麻省理工學院
llnl-Code-789122