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