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이 플러싱 전송을 시작하기 전에 모든 전송 버퍼에 허용되는 집계 크기 (바이트)를 지정하는 세 번째 인수가 있습니다. 여기서는 32MB의 집계 전송 버퍼 공간이있는 버퍼를 만들 것입니다.
ygm::comm world (&argc, &argv, 32 * 1024 * 1024 );다음으로 YGM을 통해 람다를 보내야합니다. 우리는 간단한 Hello_world 유형의 Lambda를 할 것입니다.
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에 주어질 수있는 두 가지 뚜렷한 람다의 람다 (Lambdas)가 있습니다 : 원격 람다 와 로컬 람다 (Lambdas) 는 각각 다른 요구 사항이 있습니다.
원격 람다는 다른 순위에서 잠재적으로 처형 될 수있는 람다입니다. 이 람다는 async_ 에 의해 접두사를 통해 ygm::comm 또는 스토리지 컨테이너에 주어진 것으로 식별됩니다.
원격 람다의 정의 기능은 변수를 캡처해서는 안된다는 것 입니다. 모든 변수는 인수로 제공되어야합니다. 이 제한은 YGM이 다른 순위로 전송 될 메시지를 직렬화 할 때 이러한 인수를 검사하고 추출 할 수있는 능력이 부족하기 때문입니다.
현지 람다는 원격 순위로 보내지 않도록 보장되는 람다입니다. 이 람다는 스토리지 컨테이너에서 for_all 작업에 제공되는 것으로 식별됩니다.
로컬 람다의 정의 특징은 컨테이너에 저장된 것 외에 모든 인수를 캡처해야한다는 것입니다. 내부적 으로이 람다는 각 순위에 로컬로 저장된 컨테이너의 요소를 반복하는 std::for_each 에 주어질 수 있습니다.
YGM은 MIT 라이센스에 따라 배포됩니다.
모든 새로운 기부금은 MIT 라이센스에 따라 이루어져야합니다.
자세한 내용은 License-MIT, 통지 및 저작권을 참조하십시오.
SPDX- 라이센스 식별기 : MIT
LLNL 코드 -789122