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 ()
هنا سوف نسير عبر برنامج YGM الأساسي "Hello World". يحتوي دليل الأمثلة على العديد من الأمثلة الأخرى ، بما في ذلك العديد منها باستخدام حاويات تخزين YGM.
للبدء ، هناك حاجة إلى رؤوس لمواصل YGM
# include < ygm/comm.hpp > في بداية البرنامج ، يجب بناء اتصال YGM. سيتم منح argc و argv مثل MPI_Init ، ولديه وسيطة ثالثة اختيارية تحدد الحجم الكلي (بالبايت) المسموح بها لجميع المخازن المؤقتة قبل أن تبدأ YGM إرسال إرسال. هنا ، سنقوم بإنشاء مخزن مؤقت مع 32 ميغابايت من إجمالي مساحة العازلة.
ygm::comm world (&argc, &argv, 32 * 1024 * 1024 );بعد ذلك ، نحتاج إلى Lambda لإرساله من خلال YGM. سنفعل نوعًا بسيطًا من Lambda.
auto hello_world_lambda = []( const std::string &name) {
std::cout << " Hello " << name << std::endl;
}; أخيرًا ، نستخدم هذا lambda داخل مكالمات async الخاصة بنا. في هذه الحالة ، سيكون لدينا المرتبة 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 عن بعد هي عدم التقاط أي متغيرات ؛ يجب توفير جميع المتغيرات كوسائط. يرجع هذا القيد إلى عدم قدرة YGM على فحص هذه الحجج واستخراجها عند إرسال الرسائل التسلسلية إلى صفوف أخرى.
Lambda المحلي هو أي lambda مضمونة بعدم إرسالها إلى مرتبة بعيد. يتم تحديد هذه lambdas على أنها تلك التي يتم تقديمها لعملية for_all على حاوية تخزين.
الميزة المميزة لـ Lambdas المحلية هي أنه يجب التقاط جميع الحجج إلى جانب ما يتم تخزينه في الحاوية. داخليًا ، قد يتم إعطاء هذه lambdas إلى std::for_each التي تتكرر على عناصر الحاوية المخزنة محليًا في كل رتبة.
يتم توزيع YGM تحت رخصة معهد ماساتشوستس للتكنولوجيا.
يجب تقديم جميع المساهمات الجديدة بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.
انظر الترخيص ، والإشعار ، وحقوق الطبع والنشر للحصول على التفاصيل.
spdx-recense-idention: MIT
llnl-code-789122