.\" Man page generated from reStructuredText. . .TH "MPIRUN" "1" "Feb 23, 2026" "" "Open MPI" . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .SH "نام (NAME)" mpirun \- اجرای کارهای ترتیبی و موازی در Open MPI .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 \fBmpirun\fP و \fBmpiexec\fP مترادف یکدیگرند. در واقع، آن‌ها پیوندهای نمادین به همان فایل اجرایی هستند. استفاده از هر یک از نام‌ها رفتار کاملاً یکسانی را ایجاد خواهد کرد. .UNINDENT .UNINDENT .SH "خلاصه دستور (SYNOPSIS)" .sp مدل تک‌فرآیند با داده‌های چندگانه (SPMD): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C mpirun [ options ] [ ] .ft P .fi .UNINDENT .UNINDENT .sp مدل دستورات چندگانه با داده‌های چندگانه (MIMD): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C mpirun [ global_options ] [ local_options1 ] [ ] : [ local_options2 ] [ ] : ... : [ local_optionsN ] [ ] .ft P .fi .UNINDENT .UNINDENT .sp توجه داشته باشید که در هر دو مدل، فراخوانی \fBmpirun\fP از طریق مسیر مطلق معادل تعیین گزینه \fB\-\-prefix\fP با مقدار \fB\fP برابر با دایرکتوری محل قرارگیری \fBmpirun\fP منهای آخرین زیردایرکتوری آن است. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ /usr/local/bin/mpirun ... .ft P .fi .UNINDENT .UNINDENT .sp معادل است با .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-prefix /usr/local .ft P .fi .UNINDENT .UNINDENT .SH "خلاصه سریع (QUICK SUMMARY)" .sp اگر صرفاً به دنبال نحوه اجرای یک برنامه MPI هستید، احتمالاً می‌خواهید از خط فرمانی به شکل زیر استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun [ \-n X ] [ \-\-hostfile ] .ft P .fi .UNINDENT .UNINDENT .sp این دستور \fBX\fP نسخه از \fB\fP را در محیط زمان اجرای فعلی شما اجرا می‌کند (اگر تحت یک مدیر منابع پشتیبانی‌شده اجرا شود، \fBmpirun\fP در Open MPI معمولاً به طور خودکار از آغازگر فرآیند مدیر منابع مربوطه استفاده می‌کند، بر خلاف مثلاً \fBssh\fP که نیاز به استفاده از فایل میزبان دارد، یا به طور پیش‌فرض تمام \fBX\fP نسخه را روی لوکال‌هاست اجرا می‌کند)، و زمان‌بندی (به‌طور پیش‌فرض) را به صورت نوبت‌گردشی بر اساس اسلات CPU انجام می‌دهد. برای جزئیات بیشتر به ادامه این مستندات مراجعه کنید. .sp لطفاً توجه داشته باشید که \fBmpirun\fP فرآیندها را به طور خودکار به منابع سخت‌افزاری مقید می‌کند. در غیاب هرگونه دستورالعمل اضافی، از سه الگوی مقیدسازی استفاده می‌شود (برای جزئیات بیشتر به بخش پیش‌فرض‌های نگاشت/رتبه‌بندی/مقیدسازی مراجعه کنید): .INDENT 0.0 .IP \(bu 2 \fBمقیدسازی به هسته (Bind to core)\fP: زمانی که تعداد فرآیندها ۲ => باشد .IP \(bu 2 \fBمقیدسازی به بسته پردازنده (Bind to package)\fP: زمانی که تعداد فرآیندها > ۲ باشد .IP \(bu 2 \fBعدم مقیدسازی (Bind to none)\fP: در صورت اشتراک بیش از حد (Oversubscribed) .UNINDENT .sp اگر برنامه شما از ریسه‌ها (تردها) استفاده می‌کند، احتمالاً می‌خواهید اطمینان حاصل کنید که یا اصلاً مقید نشده‌اید (با مشخص کردن \fB\-\-bind\-to none\fP) یا با استفاده از یک سطح مقیدسازی مناسب یا تعداد مشخصی از عناصر پردازشی برای هر فرآیند برنامه، به چندین هسته مقید شده‌اید. .SH "استفاده OPEN MPI از PRRTE (OPEN MPI’S USE OF PRRTE)" .sp Open MPI از محیط زمان اجرای مرجع PMIx (یا PRRTE) به عنوان موتور اصلی برای راه‌اندازی، نظارت و خاتمه دادن به فرآیندهای MPI استفاده می‌کند. .sp بخش عمده‌ای از مستندات زیر مستقیماً از PRRTE وارد شده است. از این رو، مکرراً به مفاهیم و گزینه‌های خط فرمان PRRTE اشاره می‌کند. به جز موارد ذکر شده، این مفاهیم و آرگومان‌های خط فرمان همگی برای Open MPI نیز قابل اعمال هستند. Open MPI گزینه‌های خط فرمان موجود PRRTE را گسترش می‌دهد و همچنین در چند مورد رفتارهای پیش‌فرض PRRTE را اندکی تغییر می‌دهد. این موارد به طور مشخص در مستندات زیر توضیح داده خواهند شد. .SH "گزینه‌های خط فرمان (COMMAND LINE OPTIONS)" .sp هسته پردازش \fBmpirun\fP در Open MPI از طریق \fI\%PRRTE\fP انجام می‌شود. به طور مشخص: \fBmpirun\fP در واقع یک پوشش دور \fBprterun\fP است، اما گزینه‌های خط فرمان \fBmpirun\fP اندکی با دستورات خط فرمان PRRTE تفاوت دارد. .SS "بدون محتوا (No content)" .sp محتوای معناداری در این بخش وجود ندارد زیرا Open MPI یا: .INDENT 0.0 .IP \(bu 2 بدون پشتیبانی از PRRTE ساخته شده است. .IP \(bu 2 با نسخه‌ای از PRRTE ساخته شده است که بیش از حد قدیمی بوده و مستندات خوانا برای ماشین را که بتوان در مستندات Open MPI گنجاند، شامل نمی‌شده است. .UNINDENT .sp اگر Open MPI را با نسخه جدیدتری از PRRTE بسازید (و ابزار Sphinx هنگام اجرای دستور \fBconfigure\fP در دسترس باشد)، باید مستندات معنادارتری را در اینجا دریافت کنید. .sp از این رو، مستنداتی برای این بخش وجود ندارد. .sp با عرض پوزش! .SH "گزینه‌ها (OPTIONS)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی است" .sp این بخش قدیمی از محتوای دستی کدگذاری‌شده است. احتمالاً باید بررسی و بازبینی شود تا مشخص گردد چه مواردی را می‌خواهیم نگه داریم و چه مواردی را باید کنار بگذاریم. .sp می‌توانید به جای تکرار محتوا در اینجا، به \fI\%https://docs.prrte.org\fP مراجعه کنید (برای مثال برای تعریف اسلات و موارد دیگر). .UNINDENT .UNINDENT .sp دستور mpirun نام دایرکتوری محل فراخوانی خود در گره محلی را به هر یک از گره‌های از راه دور ارسال کرده و تلاش می‌کند به آن دایرکتوری تغییر مسیر دهد. برای جزئیات بیشتر به بخش «دایرکتوری کاری جاری» در ادامه مراجعه کنید. .INDENT 0.0 .IP \(bu 2 \fB\fP: فایل اجرایی برنامه. این مورد به عنوان اولین آرگومان ناشناخته برای mpirun شناسایی می‌شود. .IP \(bu 2 \fB\fP: ارسال این آرگومان‌های زمان اجرا به هر فرآیند جدید. این موارد باید همیشه آخرین آرگومان‌ها به mpirun باشند. در صورت استفاده از فایل زمینه برنامه (App context)، \fB\fP نادیده گرفته خواهد شد. .IP \(bu 2 \fB\-h\fP، \fB\-\-help\fP: نمایش راهنما برای این دستور. .IP \(bu 2 \fB\-q\fP، \fB\-\-quiet\fP: سرکوب پیام‌های اطلاعاتی از orterun در طول اجرای برنامه. .IP \(bu 2 \fB\-v\fP، \fB\-\-verbose\fP: خروجی با جزئیات کامل (پرحرف). .IP \(bu 2 \fB\-V\fP، \fB\-\-version\fP: چاپ شماره نسخه. اگر آرگومان دیگری داده نشود، این گزینه همچنین باعث خروج orterun خواهد شد. .IP \(bu 2 \fB\-N \fP: راه‌اندازی num فرآیند در هر گره روی تمام گره‌های تخصیص‌یافته (مترادف \fB\-\-npernode\fP). .IP \(bu 2 \fB\-\-display\-map\fP: نمایش جدولی که مکان نگاشت‌شده هر فرآیند را پیش از راه‌اندازی نشان می‌دهد. .IP \(bu 2 \fB\-\-display\-allocation\fP: نمایش تخصیص منابع شناسایی‌شده. .IP \(bu 2 \fB\-\-output\-proctable\fP: خروجی جدول فرآیندهای دیباگر پس از راه‌اندازی. .IP \(bu 2 \fB\-\-dvm\fP: ایجاد یک ماشین مجازی توزیع‌شده دائمی (DVM). .IP \(bu 2 \fB\-\-max\-vm\-size \fP: تعداد دیمن‌هایی که باید راه‌اندازی شوند. .UNINDENT .sp برای تعیین این‌که کدام میزبان‌ها (گره‌ها) از کلاستر باید برنامه را اجرا کنند، از یکی از گزینه‌های زیر استفاده کنید. توجه داشته باشید که از ابتدای نسخه v1.8، mpirun در ابتدای اجرا روی تک‌تک میزبان‌های موجود در تخصیص (طبق تغییرات ایجادشده توسط گزینه‌های زیر) یک دیمن راه‌اندازی می‌کند، صرف‌نظر از این‌که فرآیندهای برنامه در نهایت برای اجرا در آنجا نگاشت شوند یا خیر. این کار برای امکان‌پذیر شدن جمع‌آوری اطلاعات توپولوژی سخت‌افزاری از گره‌های راه دور انجام می‌شود تا بتوان فرآیندها را بر اساس توپولوژی شناخته‌شده نگاشت کرد. با این حال، این یک تغییر رفتاری نسبت به نسخه‌های قبلی است که در آن‌ها دیمن‌ها تنها پس از تکمیل نگاشت راه‌اندازی می‌شدند و بنابراین فقط در گره‌هایی اجرا می‌شدند که فرآیندهای برنامه واقعاً در آنجا اجرا می‌شدند. .INDENT 0.0 .IP \(bu 2 \fB\-H\fP، \fB\-\-host \fP: فهرستی از میزبان‌هایی که فرآیندها باید روی آن‌ها فراخوانی شوند. .IP \(bu 2 \fB\-\-hostfile \fP: ارائه یک فایل میزبان برای استفاده. .IP \(bu 2 \fB\-\-default\-hostfile \fP: ارائه یک فایل میزبان پیش‌فرض. .IP \(bu 2 \fB\-\-machinefile \fP: مترادف برای \fB\-\-hostfile\fP\&. .IP \(bu 2 \fB\-\-cpu\-set \fP: محدود کردن فرآیندهای راه‌اندازی‌شده به CPUهای منطقی مشخص‌شده در هر گره (فهرست جداشده با کاما). توجه داشته باشید که گزینه‌های مقیدسازی همچنان در محدوده مشخص‌شده اعمال خواهند شد — برای مثال، می‌توانید انتخاب کنید که هر فرآیند را فقط به یک CPU در مجموعه CPUهای مشخص‌شده مقید کنید. .UNINDENT .sp گزینه‌های زیر تعداد فرآیندها را برای راه‌اندازی مشخص می‌کنند. توجه داشته باشید که هیچ‌یک از گزینه‌ها دلالت بر یک سیاست مقیدسازی خاص ندارند — برای مثال، درخواست N فرآیند برای هر بسته پردازنده به این معنی نیست که فرآیندها به آن بسته مقید خواهند شد. .INDENT 0.0 .IP \(bu 2 \fB\-n\fP، \fB\-\-n\fP، \fB\-c\fP، \fB\-np <#>\fP: اجرای این تعداد نسخه از برنامه در گره‌های داده‌شده. این گزینه نشان می‌دهد که فایل مشخص‌شده یک برنامه اجرایی است و نه یک زمینه برنامه. اگر مقداری برای تعداد نسخه‌های اجرایی ارائه نشود (یعنی نه \fB\-n\fP و نه مترادف‌های آن در خط فرمان ارائه نشوند)، Open MPI به طور خودکار یک نسخه از برنامه را روی هر اسلات فرآیند اجرا می‌کند (برای توضیح «اسلات فرآیند» به تعریف اسلات در PRRTE مراجعه کنید). با این حال، این ویژگی فقط در مدل SPMD قابل استفاده است و در غیر این صورت (بدون شروع اجرای برنامه) خطا برمی‌گرداند. .sp \fBNOTE:\fP .INDENT 2.0 .INDENT 3.5 گزینه \fB\-n\fP گزینه ترجیحی برای تعیین تعداد نسخه‌های اجرایی برنامه است، اما گزینه‌های جایگزین نیز پذیرفته می‌شوند. .UNINDENT .UNINDENT .IP \(bu 2 \fB\-\-map\-by ppr:N:\fP: راه‌اندازی N برابر تعداد اشیاء از نوع مشخص‌شده در هر گره. .IP \(bu 2 \fB\-\-npersocket <#persocket>\fP: در هر گره، این تعداد فرآیند را ضرب در تعداد سوکت‌های پردازنده در گره راه‌اندازی می‌کند. گزینه \-npersocket همچنین گزینه \fB\-\-bind\-to\-socket\fP را فعال می‌کند. (منسوخ شده به نفع \fB\-\-map\-by ppr:n:package\fP) .IP \(bu 2 \fB\-\-npernode <#pernode>\fP: در هر گره، این تعداد فرآیند را راه‌اندازی می‌کند. (منسوخ شده به نفع \fB\-\-map\-by ppr:n:node\fP). .IP \(bu 2 \fB\-\-pernode\fP: در هر گره، یک فرآیند راه‌اندازی می‌کند — معادل \fB\-\-npernode 1\fP\&. (منسوخ شده به نفع \fB\-\-map\-by ppr:1:node\fP) .UNINDENT .sp برای نگاشت فرآیندها: .INDENT 0.0 .IP \(bu 2 \fB\-\-map\-by \fP: نگاشت به شیء مشخص‌شده، پیش‌فرض \fBpackage\fP است. گزینه‌های پشتیبانی‌شده عبارتند از \fBslot\fP، \fBhwthread\fP، \fBcore\fP، \fBL1cache\fP، \fBL2cache\fP، \fBL3cache\fP، \fBpackage\fP، \fBnuma\fP، \fBnode\fP، \fBseq\fP، \fBrankfile\fP، \fBpe\-list=#\fP و \fBppr\fP\&. هر شیء می‌تواند با افزودن یک \fB:\fP و هر ترکیبی از موارد زیر، شامل اصلاح‌کننده‌ها باشد: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBpe=n\fP: مقید کردن \fBn\fP عنصر پردازشی به هر فرآیند .IP \(bu 2 \fBspan\fP: تعادل بار فرآیندها در سراسر تخصیص .IP \(bu 2 \fBoversubscribe\fP: اجازه فرآیندهای بیشتر در یک گره نسبت به عناصر پردازشی .IP \(bu 2 \fBnooversubscribe\fP: اجازه \fIندادن\fP به فرآیندهای بیشتر در یک گره نسبت به عناصر پردازشی (پیش‌فرض) .IP \(bu 2 \fBnolocal\fP: قرار ندادن فرآیندها در همان میزبان فرآیند \fBmpirun\fP .IP \(bu 2 \fBhwtcpus\fP: استفاده از ریسه‌های سخت‌افزاری به عنوان اسلات‌های CPU برای نگاشت .IP \(bu 2 \fBcorecpus\fP: استفاده از هسته‌های پردازنده به عنوان اسلات‌های CPU برای نگاشت (پیش‌فرض) .IP \(bu 2 \fBfile=filename\fP: استفاده همراه با \fBrankfile\fP؛ استفاده از \fBfilename\fP برای مشخص کردن فایل مورد نظر .IP \(bu 2 \fBordered\fP: استفاده همراه با \fBpe\-list\fP برای مقید کردن هر فرآیند به یکی از عناصر پردازشی مشخص‌شده .UNINDENT .UNINDENT .UNINDENT .sp \fBNOTE:\fP .INDENT 2.0 .INDENT 3.5 \fBsocket\fP نیز به عنوان نام مستعار برای \fBpackage\fP پذیرفته می‌شود. .UNINDENT .UNINDENT .IP \(bu 2 \fB\-\-bycore\fP: نگاشت فرآیندها بر اساس هسته (منسوخ شده به نفع \fB\-\-map\-by core\fP). .IP \(bu 2 \fB\-\-byslot\fP: نگاشت و رتبه‌بندی فرآیندها به صورت نوبت‌گردشی بر اساس اسلات (منسوخ شده به نفع \fB\-\-map\-by slot\fP). .IP \(bu 2 \fB\-\-nolocal\fP: عدم اجرای هیچ نسخه‌ای از برنامه راه‌اندازی‌شده در همان گره‌ای که orterun در حال اجرا است. این گزینه تعیین لوکال‌هاست را با \fB\-\-host\fP یا هر سازوکار تعیین میزبان دیگری بازنویسی و لغو می‌کند. نام مستعار برای \fB\-\-map\-by :nolocal\fP\&. .IP \(bu 2 \fB\-\-nooversubscribe\fP: عدم اشتراک بیش از حد در هر یک از گره‌ها؛ در صورتی که تعداد فرآیندهای درخواستی باعث اشتراک بیش از حد شود، خطا می‌دهد (بدون شروع هیچ فرآیندی). این گزینه به طور ضمنی «max_slots» را برابر با مقدار «slots» برای هر گره قرار می‌دهد. (به‌طور پیش‌فرض فعال است). نام مستعار برای \fB\-\-map\-by :nooversubscribe\fP\&. .IP \(bu 2 \fB\-\-oversubscribe\fP: اجازه اشتراک بیش از حد به گره‌ها، حتی در یک سیستم مدیریت‌شده، و بارگذاری بیش از حد عناصر پردازشی داده می‌شود. نام مستعار برای \fB\-\-map\-by :oversubscribe\fP\&. .IP \(bu 2 \fB\-\-bynode\fP: راه‌اندازی فرآیندها به صورت یکی در هر گره، با چرخش بین گره‌ها به شیوه نوبت‌گردشی. این کار فرآیندها را به طور یکنواخت بین گره‌ها پخش می‌کند و رتبه‌های \fBMPI_COMM_WORLD\fP را به صورت نوبت‌گردشی بر اساس گره تخصیص می‌دهد. (منسوخ شده به نفع \fB\-\-map\-by node\fP) .IP \(bu 2 \fB\-\-cpu\-list \fP: فهرست جداشده با کاما از شناسه‌های پردازنده که فرآیندها باید به آن‌ها مقید شوند [پیش‌فرض=\(ga\(gaNULL\(ga\(ga]. شناسه‌های پردازنده به عنوان شناسه‌های منطقی هسته hwloc تفسیر می‌شوند. .sp \fBNOTE:\fP .INDENT 2.0 .INDENT 3.5 می‌توانید دستور \fBlstopo(1)\fP در hwloc را اجرا کنید تا فهرستی از هسته‌های موجود و شناسه‌های منطقی آن‌ها را مشاهده کنید. .UNINDENT .UNINDENT .UNINDENT .sp برای مرتب‌سازی رتبه‌های فرآیندها در \fBMPI_COMM_WORLD\fP: .INDENT 0.0 .IP \(bu 2 \fB\-\-rank\-by \fP: رتبه‌بندی به شیوه نوبت‌گردشی بر اساس حالت مشخص‌شده، پیش‌فرض slot است. گزینه‌های پشتیبانی‌شده شامل \fBslot\fP، \fBnode\fP، \fBfill\fP و \fBspan\fP هستند. .UNINDENT .sp برای مقیدسازی فرآیند: .INDENT 0.0 .IP \(bu 2 \fB\-\-bind\-to \fP: مقید کردن فرآیندها به شیء مشخص‌شده، پیش‌فرض \fBcore\fP است. گزینه‌های پشتیبانی‌شده شامل \fBslot\fP، \fBhwthread\fP، \fBcore\fP، \fBl1cache\fP، \fBl2cache\fP، \fBl3cache\fP، \fBpackage\fP، \fBnuma\fP و \fBnone\fP هستند. .IP \(bu 2 \fB\-\-cpus\-per\-proc <#perproc>\fP: مقید کردن هر فرآیند به تعداد مشخصی از CPUها. (منسوخ شده به نفع \fB\-\-map\-by :PE=n\fP) .IP \(bu 2 \fB\-\-cpus\-per\-rank <#perrank>\fP: نام مستعار برای \fB\-\-cpus\-per\-proc\fP\&. (منسوخ شده به نفع \fB\-\-map\-by :PE=n\fP) .IP \(bu 2 \fB\-\-bind\-to\-core\fP: مقید کردن فرآیندها به هسته‌ها (منسوخ شده به نفع \fB\-\-bind\-to core\fP) .IP \(bu 2 \fB\-\-bind\-to\-socket\fP: مقید کردن فرآیندها به سوکت‌های پردازنده (منسوخ شده به نفع \fB\-\-bind\-to package\fP) .IP \(bu 2 \fB\-\-report\-bindings\fP: گزارش هرگونه مقیدسازی برای فرآیندهای راه‌اندازی‌شده. .UNINDENT .sp برای فایل‌های رتبه‌بندی (Rankfiles): .INDENT 0.0 .IP \(bu 2 \fB\-\-rankfile \fP: ارائه یک فایل رتبه‌بندی. (منسوخ شده به نفع \fB\-\-map\-by rankfile:file=FILE\fP) .UNINDENT .sp برای مدیریت ورودی/خروجی استاندارد: .INDENT 0.0 .IP \(bu 2 \fB\-\-output\-filename \fP: تغییر مسیر stdout، stderr و stddiag تمام فرآیندها به نسخه منحصر‌به‌فرد از نام فایل مشخص‌شده برای هر فرآیند. هر دایرکتوری در نام فایل به طور خودکار ایجاد خواهد شد. هر فایل خروجی شامل \fBfilename.id\fP خواهد بود که در آن \fBid\fP رتبه فرآیند در \fBMPI_COMM_WORLD\fP است که برای مرتب‌سازی صحیح در فهرست‌ها، با صفر از سمت چپ پر شده است. مقدار مسیر نسبی بر اساس دایرکتوری کاری جاری (cwd) محل اجرای mpirun به یک مسیر مطلق تبدیل خواهد شد. توجه داشته باشید که این گزینه در محیط‌هایی که سیستم فایل در گره‌های محاسباتی با محیط محل اجرای \fI\%mpirun(1)\fP تفاوت دارد، کار نخواهد کرد. .IP \(bu 2 \fB\-\-stdin \fP: رتبه \fBMPI_COMM_WORLD\fP فرآیندی که باید stdin را دریافت کند. مقدار پیش‌فرض، فوروارد کردن stdin به رتبه 0 در \fBMPI_COMM_WORLD\fP است، اما این گزینه می‌تواند برای فوروارد کردن stdin به هر فرآیندی استفاده شود. همچنین مشخص کردن none به نشانه عدم دریافت stdin توسط هیچ فرآیندی مجاز است. .IP \(bu 2 \fB\-\-merge\-stderr\-to\-stdout\fP: ادغام کردن stderr در stdout برای هر فرآیند. .IP \(bu 2 \fB\-\-tag\-output\fP: برچسب‌گذاری هر خط خروجی به stdout، stderr و stddiag با \fB[jobid, MCW_rank]\fP که نشان‌دهنده شناسه کار (jobid) فرآیند و رتبه \fBMPI_COMM_WORLD\fP فرآیند تولیدکننده خروجی و کانال تولیدکننده آن است. .IP \(bu 2 \fB\-\-timestamp\-output\fP: ثبت برچسب زمان (Timestamp) برای هر خط خروجی به stdout، stderr و stddiag. .IP \(bu 2 \fB\-\-xml\fP: ارائه تمام خروجی‌ها به stdout، stderr و stddiag در قالب XML. .IP \(bu 2 \fB\-\-xml\-file \fP: ارائه تمام خروجی‌ها در قالب XML به فایل مشخص‌شده. .IP \(bu 2 \fB\-\-xterm \fP: نمایش خروجی فرآیندهای مشخص‌شده بر اساس رتبه‌های \fBMPI_COMM_WORLD\fP آن‌ها در پنجره‌های مجزای xterm. رتبه‌ها به صورت فهرستی از بازه‌ها با کاما مشخص می‌شوند که در آن \fB\-1\fP نشان‌دهنده همه است. برای هر فرآیند مشخص‌شده یک پنجره جداگانه ایجاد خواهد شد. .sp \fBNOTE:\fP .INDENT 2.0 .INDENT 3.5 xterm معمولاً پنجره را پس از خاتمه فرآیند در حال اجرا در آن می‌بندد. با این حال، با افزودن یک \fB!\fP به انتهای فهرست رتبه‌های مشخص‌شده، گزینه‌های مناسب برای اطمینان از باز ماندن پنجره xterm پس از خاتمه فرآیند فراهم می‌شود و بدین ترتیب به شما امکان می‌دهد خروجی فرآیند را مشاهده کنید. در این صورت، هر پنجره xterm بعداً باید به طور دستی بسته شود. .sp نکته: در برخی محیط‌ها، xterm ممکن است نیاز داشته باشد که فایل اجرایی در مسیر (PATH) کاربر باشد، یا به صورت مطلق یا نسبی مشخص شود. بنابراین، ممکن است لازم باشد یک فایل اجرایی محلی به عنوان \fB\&./my_mpi_app\fP به جای صرفاً \fBmy_mpi_app\fP مشخص شود. اگر xterm نتواند فایل اجرایی را پیدا کند، \fBmpirun\fP متوقف (Hang) خواهد شد، اما همچنان به ctrl\-C به درستی پاسخ می‌دهد. در صورت وقوع این اتفاق، لطفاً بررسی کنید که فایل اجرایی به درستی مشخص شده باشد و دوباره امتحان کنید. .UNINDENT .UNINDENT .UNINDENT .sp برای مدیریت فایل‌ها و محیط زمان اجرا: .INDENT 0.0 .IP \(bu 2 \fB\-\-path \fP: مقدار \fB\fP که در هنگام تلاش برای یافتن فایل‌های اجرایی درخواستی استفاده خواهد شد. این گزینه پیش از بررسی متغیر محیطی محلی \fBPATH\fP به کار می‌رود. .IP \(bu 2 \fB\-\-prefix \fP: دایرکتوری پیشوندی که برای تنظیم \fBPATH\fP و \fBLD_LIBRARY_PATH\fP در گره راه دور پیش از فراخوانی Open MPI یا فرآیند هدف استفاده خواهد شد. بخش \fI\%اجرای از راه دور\fP را در ادامه ببینید. .IP \(bu 2 \fB\-\-noprefix\fP: غیرفعال کردن رفتار خودکار \fB\-\-prefix\fP. .IP \(bu 2 \fB\-\-preload\-binary\fP: کپی کردن فایل(های) اجرایی مشخص‌شده به ماشین‌های راه دور پیش از شروع فرآیندهای راه دور. فایل‌های اجرایی در دایرکتوری نشست Open MPI کپی شده و پس از اتمام کار حذف خواهند شد. .IP \(bu 2 \fB\-\-preload\-files \fP: بارگذاری اولیه فهرست جداشده با کاما از فایل‌ها در دایرکتوری کاری جاری ماشین‌های راه دور پیش از شروع فرآیندها. .IP \(bu 2 \fB\-\-set\-cwd\-to\-session\-dir\fP: تنظیم دایرکتوری کاری فرآیندهای راه‌اندازی‌شده بر روی دایرکتوری نشست آن‌ها. .IP \(bu 2 \fB\-\-wd \fP: مترادف برای \fB\-wdir\fP\&. .IP \(bu 2 \fB\-\-wdir \fP: تغییر مسیر به دایرکتوری \fB\fP پیش از اجرای برنامه کاربر. برای نکات مربوط به مسیرهای نسبی به بخش \fI\%دایرکتوری کاری جاری\fP مراجعه کنید. نکته: اگر گزینه \fB\-\-wdir\fP هم در خط فرمان و هم در زمینه برنامه وجود داشته باشد، زمینه برنامه بر خط فرمان اولویت خواهد داشت. بنابراین، اگر مسیر دایرکتوری کاری مورد نظر در گره‌های پس‌زمینه متفاوت است، باید به عنوان یک مسیر مطلق که برای گره پس‌زمینه صحیح است، مشخص شود. .IP \(bu 2 \fB\-x \fP: صادر کردن متغیرهای محیطی مشخص‌شده به گره‌های راه دور پیش از اجرای برنامه. در هر گزینه \fB\-x\fP تنها می‌توان یک متغیر محیطی را مشخص کرد. می‌توان متغیرهای محیطی موجود را مشخص نمود یا نام‌های جدید متغیر را با مقادیر متناظر تعیین کرد. برای مثال: .INDENT 2.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-x DISPLAY \-x OFILE=/tmp/out ... .ft P .fi .UNINDENT .UNINDENT .sp تجزیه‌کننده گزینه \fB\-x\fP چندان پیچیده نیست؛ حتی مقادیر نقل‌قول‌شده را نمی‌پذیرد. به کاربران توصیه می‌شود ابتدا متغیرها را در محیط مقداردهی کنند و سپس از \fB\-x\fP برای صادر کردن (نه تعریف کردن) آن‌ها استفاده نمایند. .UNINDENT .sp تنظیم پارامترهای MCA: .INDENT 0.0 .IP \(bu 2 \fB\-\-gmca \fP: ارسال پارامترهای عمومی MCA که برای همه زمینه‌ها قابل اعمال هستند. \fB\fP نام پارامتر و \fB\fP مقدار پارامتر است. .IP \(bu 2 \fB\-\-mca \fP: ارسال آرگومان‌ها به ماژول‌های مختلف MCA. برای جزئیات بیشتر به بخش \fI\%تنظیم پارامترهای MCA\fP مراجعه کنید. .sp \fBNOTE:\fP .INDENT 2.0 .INDENT 3.5 برنامه Open MPI تلاش می‌کند پارامترهای MCA مربوط به PMIx و PRRTE را که از طریق \fB\-\-mca\fP ارسال شده‌اند تشخیص داده و به درستی با آن‌ها رفتار کند، اما ممکن است همیشه حدس درستی نزند. بهترین کار این است که به ترتیب هنگام ارسال پارامترهای MCA به PMIx و PRRTE از \fB\-\-pmixmca\fP و \fB\-\-prtemca\fP استفاده کنید. .UNINDENT .UNINDENT .IP \(bu 2 \fB\-\-pmixmca \fP: ارسال آرگومان‌ها به ماژول‌های MCA در زیرسیستم PMIx. برای جزئیات بیشتر به بخش \fI\%تنظیم پارامترهای MCA\fP مراجعه کنید. .IP \(bu 2 \fB\-\-prtemca \fP: ارسال آرگومان‌ها به ماژول‌های MCA در زیرسیستم محیط زمان اجرای مرجع PMIx (یا PRRTE). برای جزئیات بیشتر به بخش \fI\%تنظیم پارامترهای MCA\fP مراجعه کنید. .IP \(bu 2 \fB\-\-tune \fP: تعیین یک فایل تنظیم (tune file) برای تنظیم آرگومان‌های ماژول‌های مختلف MCA و متغیرهای محیطی. به بخش «تنظیم پارامترهای MCA و متغیرهای محیطی از طریق فایل» مراجعه کنید. \fB\-\-am \fP نام مستعاری برای \fB\-\-tune \fP است. .UNINDENT .sp برای اشکال‌زدایی (Debugging): .INDENT 0.0 .IP \(bu 2 \fB\-\-get\-stack\-traces\fP: هنگامی که با گزینه \fB\-\-timeout\fP همراه شود، \fBmpirun\fP رد پشته (Stack traces) را از تمام فرآیندهای راه‌اندازی‌شده که هنگام اتمام زمان‌بندی هنوز زنده هستند دریافت و چاپ می‌کند. توجه داشته باشید که دریافت رد پشته ممکن است زمان‌بر بوده و خروجی زیادی تولید کند، به ویژه برای کارهایی با تعداد فرآیندهای بالا. .IP \(bu 2 \fB\-\-timeout \fP: حداکثر تعداد ثانیه‌هایی که \fBmpirun\fP اجرا خواهد شد. پس از این مدت زمان، \fBmpirun\fP کار راه‌اندازی‌شده را لغو کرده و با وضعیت خروج غیرصفر خارج می‌شود. استفاده از \fB\-\-timeout\fP در ترکیب با گزینه \fB\-\-get\-stack\-traces\fP نیز می‌تواند مفید باشد. .UNINDENT .sp گزینه‌های دیگری نیز وجود دارند: .INDENT 0.0 .IP \(bu 2 \fB\-\-allow\-run\-as\-root\fP: اجازه اجرای \fBmpirun\fP هنگام اجرا توسط کاربر ریشه (\fBmpirun\fP به طور پیش‌فرض هنگام اجرا توسط کاربر ریشه لغو می‌شود). حتماً برای جزئیات بیشتر بخش \fI\%اجرا به عنوان ریشه\fP را ببینید. .IP \(bu 2 \fB\-\-app \fP: ارائه یک appfile، با نادیده گرفتن تمام گزینه‌های دیگر خط فرمان. .IP \(bu 2 \fB\-\-continuous\fP: کار تا زمانی که به طور صریح متوقف نشود، ادامه یابد. .IP \(bu 2 \fB\-\-disable\-recovery\fP: غیرفعال کردن بازیابی (تمام گزینه‌های بازیابی را به حالت خاموش بازنشانی می‌کند). .IP \(bu 2 \fB\-\-do\-not\-launch\fP: انجام تمام عملیات لازم برای آماده‌سازی راه‌اندازی برنامه، اما عدم راه‌اندازی واقعی آن. .IP \(bu 2 \fB\-\-enable\-recovery\fP: فعال کردن بازیابی از خرابی فرآیند (پیش‌فرض: غیرفعال). .IP \(bu 2 \fB\-\-leave\-session\-attached\fP: عدم جداسازی دیمن‌های پس‌زمینه مورد استفاده این برنامه. این کار اجازه می‌دهد پیام‌های خطای دیمن‌ها و محیط زیرین (مثلاً در صورت عدم موفقیت در راه‌اندازی یک دیمن) چاپ شوند. .IP \(bu 2 \fB\-\-max\-restarts \fP: حداکثر تعداد دفعات راه‌اندازی مجدد یک فرآیند ناموفق. .IP \(bu 2 \fB\-\-personality \fP: فهرست جداشده با کاما از مدل برنامه‌نویسی، زبان‌ها و کانتینرهای مورد استفاده [پیش‌فرض=\(ga\(gaompi\(ga\(ga]. .IP \(bu 2 \fB\-\-ppr \fP: فهرست جداشده با کاما از تعداد فرآیندها روی یک نوع منبع معین (پیش‌فرض: هیچ). نام مستعار برای \fB\-\-map\-by ppr:N:OBJ\fP\&. .IP \(bu 2 \fB\-\-report\-child\-jobs\-separately\fP: بازگرداندن وضعیت خروج تنها برای کار اصلی. .IP \(bu 2 \fB\-\-report\-events \fP: گزارش رویدادها به ابزاری که در URI مشخص‌شده گوش می‌دهد. .IP \(bu 2 \fB\-\-report\-pid \fP: چاپ شناسه فرآیند (PID) دستور \fBmpirun\fP هنگام راه‌اندازی. کانال باید \fB\-\fP برای خروجی PID به stdout، \fB+\fP برای خروجی PID به stderr، یا نام فایلی باشد که PID باید در آن نوشته شود. .IP \(bu 2 \fB\-\-report\-uri \fP: چاپ URI دستور \fBmpirun\fP هنگام راه‌اندازی. کانال باید \fB\-\fP برای خروجی URI به stdout، \fB+\fP برای خروجی URI به stderr، یا نام فایلی باشد که URI باید در آن نوشته شود. .IP \(bu 2 \fB\-\-show\-progress\fP: خروجی یک گزارش دوره‌ای کوتاه از پیشرفت راه‌اندازی. .IP \(bu 2 \fB\-\-terminate\fP: پایان دادن به DVM. .IP \(bu 2 \fB\-\-use\-hwthread\-cpus\fP: استفاده از ریسه‌های سخت‌افزاری به عنوان CPUهای مستقل. .sp توجه داشته باشید که اگر تعداد اسلات‌ها به Open MPI ارائه نشود (مثلاً از طریق کلمه کلیدی \fBslots\fP در یک فایل میزبان یا از طریق یک مدیر منابع مانند Slurm)، استفاده از این گزینه محاسبه پیش‌فرض تعداد اسلات‌ها در یک گره را تغییر می‌دهد. برای جزئیات بیشتر به بخش تعریف اسلات در PRRTE مراجعه کنید. .sp همچنین توجه داشته باشید که استفاده از این گزینه تعریف Open MPI از یک «عنصر پردازشی» را از یک هسته پردازنده به یک ریسه سخت‌افزاری تغییر می‌دهد. برای جزئیات بیشتر به بخش تعریف عنصر پردازشی در PRRTE مراجعه کنید. .UNINDENT .sp گزینه‌های زیر برای توسعه‌دهندگان مفید هستند؛ آن‌ها عموماً برای بیشتر کاربران Open MPI کاربردی ندارند: .INDENT 0.0 .IP \(bu 2 \fB\-\-debug\-daemons\fP: فعال کردن اشکال‌زدایی دیمن‌های زمان اجرا که توسط این برنامه استفاده می‌شوند. .IP \(bu 2 \fB\-\-debug\-daemons\-file\fP: فعال کردن اشکال‌زدایی دیمن‌های زمان اجرای برنامه و ذخیره خروجی در فایل‌ها. .IP \(bu 2 \fB\-\-display\-devel\-map\fP: نمایش جدولی دقیق‌تر شامل مکان نگاشت‌شده هر فرآیند پیش از راه‌اندازی. .IP \(bu 2 \fB\-\-display\-topo\fP: نمایش توپولوژی به عنوان بخشی از نقشه فرآیند درست پیش از راه‌اندازی. .IP \(bu 2 \fB\-\-launch\-agent\fP: نام فایل اجرایی که باید برای شروع فرآیندها در گره‌های راه دور استفاده شود. پیش‌فرض \fBprted\fP است. این گزینه می‌تواند برای آزمایش مفاهیم جدید دیمن، یا برای ارسال گزینه‌ها به دیمن‌ها بدون این‌که خود mpirun آن‌ها را ببیند استفاده شود. برای مثال، تعیین یک عامل راه‌اندازی به صورت \fBprted \-\-prtemca odls_base_verbose 5\fP به توسعه‌دهنده امکان می‌دهد خروجی اشکال‌زدایی را از \fBprted\fP بدون شلوغی از جانب خود \fBmpirun\fP دریافت کند. .IP \(bu 2 \fB\-\-report\-state\-on\-timeout\fP: هنگامی که با گزینه خط فرمان \fB\-\-timeout\fP همراه شود، وضعیت زیرسیستم زمان اجرای هر فرآیند را پس از اتمام زمان‌بندی گزارش می‌دهد. .UNINDENT .sp ممکن است گزینه‌های دیگری با دستور \fBmpirun \-\-help\fP فهرست شوند. .SS "متغیرهای محیطی (Environment Variables)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 \fBMPIEXEC_TIMEOUT\fP: مترادف برای گزینه خط فرمان \fB\-\-timeout\fP. .UNINDENT .SH "توضیحات (DESCRIPTION)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp یک بار فراخوانی \fBmpirun\fP، اجرای یک برنامه MPI تحت Open MPI را آغاز می‌کند. اگر برنامه به صورت تک‌فرآیند با داده‌های چندگانه (SPMD) باشد، برنامه می‌تواند در خط فرمان \fBmpirun\fP مشخص شود. .sp اگر برنامه به صورت چنددستوری با داده‌های چندگانه (MIMD) و شامل چندین برنامه باشد، مجموعه برنامه‌ها و آرگومان‌ها را می‌توان به یکی از دو روش مشخص کرد: آرگومان‌های گسترش‌یافته خط فرمان، و زمینه برنامه (Application Context). .sp یک زمینه برنامه، مجموعه برنامه MIMD شامل تمامی آرگومان‌ها را در یک فایل جداگانه توصیف می‌کند. این فایل اساساً شامل چندین خط فرمان mpirun، منهای خود نام دستور است. امکان مشخص کردن گزینه‌های متفاوت برای نمونه‌های مختلف یک برنامه، دلیل دیگری برای استفاده از زمینه برنامه است. .sp آرگومان‌های گسترش‌یافته خط فرمان اجازه توصیف چیدمان برنامه را در خط فرمان با استفاده از دو نقطه (\fB:\fP) برای جداسازی مشخصات برنامه‌ها و آرگومان‌ها فراهم می‌کنند. برخی گزینه‌ها به صورت سراسری برای تمامی برنامه‌های مشخص‌شده تنظیم می‌شوند (مانند \fB\-\-hostfile\fP)، در حالی که برخی دیگر مخصوص یک برنامه منفرد هستند (مانند \fB\-n\fP). .SS "تعیین گره‌های میزبان (Specifying Host Nodes)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp گره‌های میزبان را می‌توان در خط فرمان \fBmpirun\fP با گزینه \fB\-\-host\fP یا در یک فایل میزبان (Hostfile) مشخص کرد. .sp برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-H aa,aa,bb ./a.out .ft P .fi .UNINDENT .UNINDENT .sp دو فرآیند را در گره \fBaa\fP و یکی را در \fBbb\fP راه‌اندازی می‌کند. .sp یا فایل میزبان زیر را در نظر بگیرید: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ cat myhostfile aa slots=2 bb slots=2 cc slots=2 .ft P .fi .UNINDENT .UNINDENT .sp در اینجا، ما هم نام‌های میزبان (\fBaa\fP، \fBbb\fP و \fBcc\fP) و هم تعداد اسلات‌های هر یک را فهرست می‌کنیم. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-hostfile myhostfile ./a.out .ft P .fi .UNINDENT .UNINDENT .sp دو فرآیند را در هر یک از این سه گره راه‌اندازی می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-hostfile myhostfile \-\-host aa ./a.out .ft P .fi .UNINDENT .UNINDENT .sp دو فرآیند را راه‌اندازی می‌کند که هر دو در گره \fBaa\fP خواهند بود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-hostfile myhostfile \-\-host dd ./a.out .ft P .fi .UNINDENT .UNINDENT .sp هیچ میزبانی را برای اجرا پیدا نمی‌کند و با خطا متوقف می‌شود. به این معنی که میزبان مشخص‌شده \fBdd\fP در فایل میزبان مشخص‌شده وجود ندارد. .sp هنگام اجرا تحت مدیران منابع (مانند Slurm، Torque و غیره)، Open MPI هم نام میزبان‌ها و هم تعداد اسلات‌ها را مستقیماً از مدیر منابع دریافت می‌کند. .SS "تعیین تعداد فرآیندها (Specifying Number of Processes)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp همان‌طور که دیدیم، تعداد فرآیندها برای اجرا را می‌توان با استفاده از فایل میزبان تنظیم کرد. سازوکارهای دیگری نیز وجود دارند. .sp تعداد فرآیندهای راه‌اندازی‌شده را می‌توان به صورت مضربی از تعداد گره‌ها یا بسته‌های پردازنده موجود مشخص کرد. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-H aa,bb \-\-map\-by ppr:2:package ./a.out .ft P .fi .UNINDENT .UNINDENT .sp فرآیندهای 0\-3 را در گره \fBaa\fP و فرآیندهای 4\-7 را در گره \fBbb\fP راه‌اندازی می‌کند (با فرض این‌که \fBaa\fP و \fBbb\fP هر کدام شامل ۴ اسلات باشند). .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-H aa,bb \-\-map\-by ppr:2:node ./a.out .ft P .fi .UNINDENT .UNINDENT .sp فرآیندهای 0\-1 را در گره \fBaa\fP و فرآیندهای 2\-3 را در گره \fBbb\fP راه‌اندازی می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-H aa,bb \-\-map\-by ppr:1:node ./a.out .ft P .fi .UNINDENT .UNINDENT .sp یک فرآیند در هر گره میزبان راه‌اندازی می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C mpirun \-H aa,bb \-\-pernode ./a.out .ft P .fi .UNINDENT .UNINDENT .sp مشابه با \fB\-\-map\-by ppr:1:node\fP و \fB\-\-npernode 1\fP است. .sp راهکار دیگر تعیین تعداد فرآیندها با گزینه \fB\-n\fP است. اکنون این فایل میزبان را در نظر بگیرید: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ cat myhostfile aa slots=4 bb slots=4 cc slots=4 .ft P .fi .UNINDENT .UNINDENT .sp اکنون اجرا با \fBmyhostfile\fP: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-hostfile myhostfile \-n 6 ./a.out .ft P .fi .UNINDENT .UNINDENT .sp فرآیندهای 0\-3 را در گره \fBaa\fP و فرآیندهای 4\-5 را در گره \fBbb\fP راه‌اندازی می‌کند. اسلات‌های باقیمانده در فایل میزبان استفاده نخواهند شد زیرا گزینه \fB\-n\fP نشان داده است که تنها ۶ فرآیند باید راه‌اندازی شوند. .SS "نگاشت فرآیندها به گره‌ها: استفاده از سیاست‌ها (Mapping Processes to Nodes: Using Policies)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp مثال‌های بالا نگاشت پیش‌فرض فرآیندها به گره‌ها را نشان می‌دهند. این نگاشت را می‌توان با گزینه‌های مختلف \fBmpirun\fP که سیاست‌های نگاشت را توصیف می‌کنند نیز کنترل کرد. .sp همان فایل میزبان بالا را دوباره با \fB\-n 6\fP در نظر بگیرید. جدول زیر چند حالت مختلف \fBmpirun\fP را فهرست کرده و نشان می‌دهد کدام رتبه‌های \fBMPI_COMM_WORLD\fP در کدام گره قرار می‌گیرند: .TS center; |l|l|l|l|. _ T{ Command T} T{ Node \fBaa\fP T} T{ Node \fBbb\fP T} T{ Node \fBcc\fP T} _ T{ \fBmpirun\fP T} T{ 0 1 2 3 T} T{ 4 5 T} T{ T} _ T{ \fBmpirun \-\-map\-by node\fP T} T{ 0 3 T} T{ 1 4 T} T{ 2 5 T} _ T{ \fBmpirun \-\-nolocal\fP T} T{ T} T{ 0 1 2 3 T} T{ 4 5 T} _ .TE .sp گزینه \fB\-\-map\-by node\fP بار فرآیندها را در سراسر گره‌های موجود متعادل می‌کند و هر فرآیند را به شیوه نوبت‌گردشی شماره‌گذاری می‌نماید. .sp گزینه \fB\-\-nolocal\fP از نگاشت هر فرآیندی روی میزبان محلی (در این مورد گره \fBaa\fP) جلوگیری می‌کند. اگرچه \fBmpirun\fP معمولاً منابع سیستمی کمی مصرف می‌کند، \fB\-\-nolocal\fP می‌تواند برای راه‌اندازی کارهای بسیار بزرگ که در آن‌ها mpirun ممکن است واقعاً نیاز به استفاده از مقادیر قابل توجهی حافظه و/یا زمان پردازش داشته باشد، مفید باشد. .sp همان‌طور که \fB\-n\fP می‌تواند فرآیندهایی کمتر از تعداد اسلات‌ها را مشخص کند، می‌تواند اسلات‌ها را دچار اشتراک بیش از حد (Oversubscribe) نیز بکند. برای مثال با همان فایل میزبان: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-hostfile myhostfile \-n 14 ./a.out .ft P .fi .UNINDENT .UNINDENT .sp فرآیندهای 0\-3 را در گره \fBaa\fP، فرآیندهای 4\-7 را در \fBbb\fP و 8\-11 را در \fBcc\fP راه‌اندازی می‌کند. سپس دو فرآیند باقیمانده را به هر گره‌ای که انتخاب کند اضافه می‌نماید. .sp همچنین می‌توان محدودیت‌هایی را برای اشتراک بیش از حد تعیین کرد. برای مثال با همان فایل میزبان: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-hostfile myhostfile \-n 14 \-\-nooversubscribe ./a.out .ft P .fi .UNINDENT .UNINDENT .sp خطا تولید خواهد کرد زیرا \fB\-\-nooversubscribe\fP از اشتراک بیش از حد جلوگیری می‌کند. .sp محدودیت‌های اشتراک بیش از حد را می‌توان در خود فایل میزبان نیز مشخص کرد: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ cat myhostfile aa slots=4 max_slots=4 bb max_slots=4 cc slots=4 .ft P .fi .UNINDENT .UNINDENT .sp فیلد \fBmax_slots\fP چنین محدودیتی را تعیین می‌کند. هنگامی که این کار را انجام می‌دهد، مقدار slots به طور پیش‌فرض برابر با این محدودیت می‌شود. اکنون: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-hostfile myhostfile \-n 14 ./a.out .ft P .fi .UNINDENT .UNINDENT .sp باعث می‌شود ۱۲ فرآیند اول مانند قبل راه‌اندازی شوند، اما دو فرآیند باقیمانده به اجبار در گره \fBcc\fP قرار گیرند. دو گره دیگر توسط فایل میزبان در برابر اشتراک بیش از حد توسط این کار محافظت می‌شوند. .sp استفاده از گزینه \fB\-\-nooversubscribe\fP می‌تواند مفید باشد زیرا Open MPI در حال حاضر مقادیر \fBmax_slots\fP را از مدیر منابع دریافت نمی‌کند. .sp البته، \fB\-n\fP را می‌توان با گزینه \fB\-H\fP یا \fB\-host\fP نیز استفاده کرد. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-H aa,bb \-n 8 ./a.out .ft P .fi .UNINDENT .UNINDENT .sp ۸ فرآیند را راه‌اندازی می‌کند. از آنجا که تنها دو میزبان مشخص شده‌اند، پس از نگاشت دو فرآیند اول (یکی به \fBaa\fP و یکی به \fBbb\fP)، فرآیندهای باقیمانده میزبان‌های مشخص‌شده را دچار اشتراک بیش از حد می‌کنند. .sp و این یک مثال MIMD است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-H aa \-n 1 hostname : \-H bb,cc \-n 2 uptime .ft P .fi .UNINDENT .UNINDENT .sp فرآیند 0 را که hostname را اجرا می‌کند در گره \fBaa\fP و فرآیندهای 1 و 2 را که هر کدام uptime را اجرا می‌کنند به ترتیب در گره‌های \fBbb\fP و \fBcc\fP راه‌اندازی می‌کند. .SS "نگاشت، رتبه‌بندی و مقیدسازی (Mapping, Ranking, and Binding: Oh My!)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp برنامه Open MPI یک فرآیند سه مرحله‌ای را برای تخصیص مکان‌ها و رتبه‌های فرآیند به کار می‌گیرد: .INDENT 0.0 .IP 1. 3 \fBنگاشت (Mapping)\fP: تخصیص یک مکان پیش‌فرض به هر فرآیند .IP 2. 3 \fBرتبه‌بندی (Ranking)\fP: تخصیص یک مقدار رتبه \fBMPI_COMM_WORLD\fP به هر فرآیند .IP 3. 3 \fBمقیدسازی (Binding)\fP: محدود کردن هر فرآیند برای اجرا روی پردازنده‌های خاص .UNINDENT .sp مرحله نگاشت برای تخصیص یک مکان پیش‌فرض به هر فرآیند بر اساس نگاشت‌کننده (Mapper) مورد استفاده به کار می‌رود. نگاشت بر اساس اسلات، گره و به صورت متوالی منجر به تخصیص فرآیندها در سطح گره می‌شود. در مقابل، نگاشت بر اساس شیء به نگاشت‌کننده امکان می‌دهد فرآیند را به یک شیء واقعی در هر گره تخصیص دهد. .sp توجه داشته باشید که مکان اختصاص‌یافته به فرآیند مستقل از جایی است که به آن مقید خواهد شد — این تخصیص صرفاً به عنوان ورودی برای الگوریتم مقیدسازی استفاده می‌شود. .sp نگاشت فرآیندها به گره‌ها نه تنها با سیاست‌های کلی، بلکه در صورت لزوم با استفاده از نگاشت‌های دلخواهی که نمی‌توان آن‌ها را با یک سیاست ساده توصیف کرد نیز قابل تعریف است. می‌توان از «نگاشت‌کننده متوالی» استفاده کرد که فایل میزبان را خط به خط خوانده و فرآیندها را به هر ترتیبی که فایل میزبان مشخص می‌کند به گره‌ها تخصیص می‌دهد. از گزینه \fB\-\-map\-by seq\fP استفاده کنید. برای مثال، با استفاده از همان فایل میزبان قبلی: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-hostfile myhostfile \-\-map\-by seq ./a.out .ft P .fi .UNINDENT .UNINDENT .sp سه فرآیند راه‌اندازی می‌کند، یکی در هر یک از گره‌های \fBaa\fP، \fBbb\fP و \fBcc\fP به ترتیب. تعداد اسلات‌ها اهمیتی ندارد؛ در هر خط روی هر گره‌ای که در آن خط فهرست شده باشد، یک فرآیند راه‌اندازی می‌شود. .sp روش دیگر برای تعیین نگاشت‌های دلخواه، استفاده از یک فایل رتبه‌بندی (Rankfile) است که به شما کنترل دقیقی روی مقیدسازی فرآیند نیز می‌دهد. فایل‌های رتبه‌بندی در ادامه بررسی شده‌اند. .sp مرحله دوم بر رتبه‌بندی فرآیند در \fBMPI_COMM_WORLD\fP کار متمرکز است. Open MPI این مرحله را از فرآیند نگاشت جدا می‌کند تا انعطاف‌پذیری بیشتری در جای‌گذاری نسبی فرآیندهای MPI فراهم سازد. این موضوع به بهترین وجه با در نظر گرفتن موارد زیر که در آن‌ها از گزینه \fB\-\-np 8 \-\-map\-by ppr:2:package \-\-host aa:4,bb:4\fP استفاده شده است، نشان داده می‌شود: .TS center; |l|l|l|. _ T{ گزینه (Option) T} T{ Node \fBaa\fP T} T{ Node \fBbb\fP T} _ T{ \fB\-\-rank\-by fill\fP (بسته‌بندی متراکم - پیش‌فرض) T} T{ 0 1 | 2 3 T} T{ 4 5 | 6 7 T} _ T{ \fB\-\-rank\-by span\fP (توزیع بار یا پراکنده) T} T{ 0 4 | 1 5 T} T{ 2 6 | 3 7 T} _ T{ \fB\-\-rank\-by node\fP T} T{ 0 2 | 4 6 T} T{ 1 3 | 5 7 T} _ .TE .sp رتبه‌بندی بر اساس \fBfill\fP رتبه‌های MCW را در یک پیشروی ساده در سراسر هر گره تخصیص می‌دهد. رتبه‌بندی با \fBspan\fP و با \fBslot\fP نتیجه یکسانی ارائه می‌دهند — یک پیشروی نوبت‌گردشی بسته‌ها در تمام گره‌ها قبل از بازگشت به اولین بسته در گره اول. رتبه‌بندی بر اساس \fBnode\fP رتبه‌های MCW را ابتدا با تکرار در گره‌ها و سپس بر اساس بسته اختصاص می‌دهد. .sp مرحله مقیدسازی عملاً هر فرآیند را به مجموعه معینی از پردازنده‌ها مقید می‌کند. این کار می‌تواند کارایی را در صورتی که سیستم‌عامل فرآیندها را به صورت غیربهینه جای‌گذاری می‌کند بهبود بخشد. برای مثال، ممکن است برخی از بسته‌های پردازنده چند‌هسته‌ای را دچار اشتراک بیش از حد کند، در حالی که بسته‌های دیگر را بیکار رها می‌سازد؛ این می‌تواند منجر به رقابت غیرضروری فرآیندها بر سر منابع مشترک شود. یا ممکن است فرآیندها را بیش از حد پراکنده کند؛ این حالت در صورتی که کارایی برنامه به هزینه‌های ارتباط بین فرآیندی حساس باشد، می‌تواند غیربهینه باشد. مقیدسازی همچنین می‌تواند مانع از مهاجرت بیش از حد فرآیندها توسط سیستم‌عامل شود، صرف‌نظر از این‌که آن فرآیندها در ابتدا چقدر بهینه جای‌گذاری شده بودند. .sp پردازنده‌هایی که باید برای مقیدسازی استفاده شوند را می‌توان از نظر گروه‌بندی‌های توپولوژیکی شناسایی کرد — به عنوان مثال، مقیدسازی به یک \fBl3cache\fP هر فرآیند را به تمامی پردازنده‌های درون محدوده یک کش L3 در مکان تخصیص‌یافته به آن‌ها مقید می‌کند. بنابراین، اگر فرآیندی توسط نگاشت‌کننده به یک بسته پردازنده معین تخصیص یابد، دستورالعمل \fB\-\-bind\-to l3cache\fP باعث می‌شود فرآیند به پردازنده‌هایی که یک کش L3 مشترک در آن بسته دارند، مقید شود. .sp از طرف دیگر، فرآیندها را می‌توان با استفاده از گزینه \fB\-\-map\-by pe\-list=\fP به هسته‌های مشخص‌شده نگاشت و مقید کرد. برای مثال، \fB\-\-map\-by pe\-list=0,2,5\fP سه فرآیند را نگاشت می‌کند که هر سه به هسته‌های منطقی \fB0,2,5\fP مقید خواهند شد. اگر قصد دارید هر یک از سه فرآیند را به هسته‌های متفاوتی مقید کنید، می‌توان از اصلاح‌کننده \fB:ordered\fP مانند \fB\-\-map\-by pe\-list=0,2,5:ordered\fP استفاده کرد. در این مثال، اولین فرآیند در یک گره به CPU 0، فرآیند دوم در آن گره به CPU 2 و فرآیند سوم در آن گره به CPU 5 مقید خواهد شد. .sp در نهایت، \fB\-\-report\-bindings\fP می‌تواند برای گزارش مقیدسازی‌ها استفاده شود. .sp به عنوان مثال، یک گره با دو بسته پردازنده را در نظر بگیرید که هر کدام شامل چهار هسته هستند و هر یک از آن هسته‌ها شامل یک ریسه سخت‌افزاری است. گزینه \fB\-\-report\-bindings\fP مقیدسازی هر فرآیند را به روشی توصیفی نشان می‌دهد. در زیر چند مثال آورده شده است. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-report\-bindings \-\-map\-by core \-\-bind\-to core [...] Rank 0 bound to package[0][core:0] [...] Rank 1 bound to package[0][core:1] [...] Rank 2 bound to package[0][core:2] [...] Rank 3 bound to package[0][core:3] .ft P .fi .UNINDENT .UNINDENT .sp در حالت بالا، فرآیندها به هسته‌های متوالی مقید می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-report\-bindings \-\-map\-by package \-\-bind\-to package [...] Rank 0 bound to package[0][core:0\-3] [...] Rank 1 bound to package[0][core:0\-3] [...] Rank 2 bound to package[1][core:4\-7] [...] Rank 3 bound to package[1][core:4\-7] .ft P .fi .UNINDENT .UNINDENT .sp در حالت بالا، فرآیندها به تمام هسته‌ها در بسته‌های متوالی مقید می‌شوند. فرآیندها به تعداد دفعات مورد نیاز به صورت نوبت‌گردشی در بسته‌های پردازنده می‌چرخند. به طور پیش‌فرض، فرآیندها به شیوه \fBfill\fP رتبه‌بندی می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-report\-bindings \-\-map\-by package \-\-bind\-to package \-\-rank\-by span [...] Rank 0 bound to package[0][core:0\-3] [...] Rank 1 bound to package[1][core:4\-7] [...] Rank 2 bound to package[0][core:0\-3] [...] Rank 3 bound to package[1][core:4\-7] .ft P .fi .UNINDENT .UNINDENT .sp حالت بالا تفاوت در رتبه‌بندی را زمانی که از اصلاح‌کننده \fBspan\fP به جای پیش‌فرض استفاده می‌شود نشان می‌دهد. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-report\-bindings \-\-map\-by slot:PE=2 \-\-bind\-to core [...] Rank 0 bound to package[0][core:0\-1] [...] Rank 1 bound to package[0][core:2\-3] [...] Rank 2 bound to package[0][core:4\-5] [...] Rank 3 bound to package[0][core:6\-7] .ft P .fi .UNINDENT .UNINDENT .sp در حالت بالا، خروجی به ما نشان می‌دهد که ۲ هسته به ازای هر فرآیند مقید شده‌اند. به طور مشخص، نگاشت بر اساس \fBslot\fP با اصلاح‌کننده \fBPE=2\fP نشان داد که هر اسلات (یعنی فرآیند) باید دو عنصر پردازشی مصرف کند. به طور پیش‌فرض، Open MPI «عنصر پردازشی» را به عنوان «هسته» تعریف می‌کند و بنابراین \fB\-\-bind\-to core\fP باعث شد هر فرآیند به هر دو هسته‌ای که به آن نگاشت شده بود، مقید شود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-report\-bindings \-\-map\-by slot:PE=2 \-\-use\-hwthread\-cpus [...]] Rank 0 bound to package[0][hwt:0\-1] [...]] Rank 1 bound to package[0][hwt:2\-3] [...]] Rank 2 bound to package[0][hwt:4\-5] [...]] Rank 3 bound to package[0][hwt:6\-7] .ft P .fi .UNINDENT .UNINDENT .sp در حالت بالا، \fB\-\-bind\-to core\fP را با \fB\-\-use\-hwthread\-cpus\fP جایگزین می‌کنیم. گزینه \fB\-\-use\-hwthread\-cpus\fP به \fB\-\-bind\-to hwthread\fP تبدیل می‌شود و به خروجی \fB\-\-report\-bindings\fP اعلام می‌کند که ریسه‌های سخت‌افزاری مقیدشده به یک فرآیند را نشان دهد. در این حالت، فرآیندها به ازای هر فرآیند به ۲ ریسه سخت‌افزاری مقید می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-report\-bindings \-\-bind\-to none [...] Rank 0 is not bound (or bound to all available processors) [...] Rank 1 is not bound (or bound to all available processors) [...] Rank 2 is not bound (or bound to all available processors) [...] Rank 3 is not bound (or bound to all available processors) .ft P .fi .UNINDENT .UNINDENT .sp در حالت بالا، مقیدسازی خاموش است و به همین صورت گزارش می‌شود. .sp پشتیبانی Open MPI از مقیدسازی فرآیند به سیستم‌عامل زیرین بستگی دارد. بنابراین، برخی از گزینه‌های مقیدسازی فرآیند ممکن است در هر سیستمی در دسترس نباشند. .sp مقیدسازی فرآیند را می‌توان با پارامترهای MCA نیز تنظیم کرد. استفاده از آن‌ها نسبت به گزینه‌های \fBmpirun\fP کمتر راحت است. از سوی دیگر، پارامترهای MCA نه تنها در خط فرمان mpirun، بلکه در فایل \fBmca\-params.conf\fP سیستم یا کاربر یا به عنوان متغیرهای محیطی، همان‌طور که در بخش \fI\%تنظیم پارامترهای MCA\fP توصیف شده است، قابل تنظیم هستند. این‌ها پارامترهای MCA برای زمان اجرای PRRTE هستند، بنابراین آرگومان خط فرمان \fB\-\-prtemca\fP (بله، \fBprte\fP با یک \fBr\fP، نه دو \fBr\fP) باید برای ارسال جفت کلید/مقدار پارامتر MCA استفاده شود. متناوباً، جفت کلید/مقدار پارامتر MCA ممکن است در خط فرمان با پیشوند قرار دادن \fBPRTE_MCA_\fP برای کلید مشخص شود (باز هم، این یک غلط املایی نیست: \fBPRTE\fP است نه \fBPRRTE\fP). برخی از مثال‌ها عبارتند از: .TS center; |l|l|l|. _ T{ Option T} T{ PRRTE MCA parameter key T} T{ Value T} _ T{ \fB\-\-map\-by core\fP T} T{ \fBrmaps_default_mapping_policy\fP T} T{ \fBcore\fP T} _ T{ \fB\-\-map\-by package\fP T} T{ \fBrmaps_default_mapping_policy\fP T} T{ \fBpackage\fP T} _ T{ \fB\-\-rank\-by fill\fP T} T{ \fBrmaps_default_ranking_policy\fP T} T{ \fBfill\fP T} _ T{ \fB\-\-bind\-to core\fP T} T{ \fBhwloc_default_binding_policy\fP T} T{ \fBcore\fP T} _ T{ \fB\-\-bind\-to package\fP T} T{ \fBhwloc_default_binding_policy\fP T} T{ \fBpackage\fP T} _ T{ \fB\-\-bind\-to none\fP T} T{ \fBhwloc_default_binding_policy\fP T} T{ \fBnone\fP T} _ .TE .SS "پیش‌فرض‌ها برای نگاشت، رتبه‌بندی و مقیدسازی (Defaults for Mapping, Ranking, and Binding)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp اگر کاربر هر یک از گزینه‌های \fB\-\-map\-by\fP، \fB\-\-rank\-by\fP و \fB\-\-bind\-to\fP را مشخص نکند، مقادیر پیش‌فرض به شرح زیر خواهند بود: .INDENT 0.0 .IP \(bu 2 اگر هیچ گزینه‌ای مشخص نشده باشد: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 اگر تعداد فرآیندها کمتر یا مساوی ۲ باشد، آنگاه: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-map\-by\fP برابر است با \fBcore\fP .IP \(bu 2 \fB\-\-bind\-to\fP برابر است با \fBcore\fP .IP \(bu 2 \fB\-\-rank\-by\fP برابر است با \fBspan\fP .IP \(bu 2 نتیجه: \fB\-\-map\-by core \-\-bind\-to core \-\-rank\-by span\fP .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 در غیر این صورت: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-map\-by\fP برابر است با \fBpackage\fP .IP \(bu 2 \fB\-\-bind\-to\fP برابر است با \fBpackage\fP .IP \(bu 2 \fB\-\-rank\-by\fP برابر است با \fBfill\fP .IP \(bu 2 نتیجه: \fB\-\-map\-by package \-\-bind\-to package \-\-rank\-by fill\fP .UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 اگر تنها \fB\-\-map\-by OBJ\fP (که در آن \fBOBJ\fP چیزی مانند \fBcore\fP است) مشخص شود، آنگاه: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-map\-by\fP مقدار \fBOBJ\fP مشخص‌شده .IP \(bu 2 \fB\-\-bind\-to\fP از همان \fBOBJ\fP مانند \fB\-\-map\-by\fP استفاده می‌کند .IP \(bu 2 \fB\-\-rank\-by\fP به طور پیش‌فرض \fBfill\fP است .IP \(bu 2 نتیجه: \fB\-\-map\-by OBJ \-\-bind\-to OBJ \-\-rank\-by fill\fP .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 اگر تنها \fB\-\-bind\-to OBJ\fP (که در آن \fBOBJ\fP چیزی مانند \fBcore\fP است) مشخص شود، آنگاه: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-map\-by\fP بسته به تعداد فرآیندها \fBcore\fP یا \fBpackage\fP است .IP \(bu 2 \fB\-\-bind\-to\fP مقدار \fBOBJ\fP مشخص‌شده .IP \(bu 2 \fB\-\-rank\-by\fP به طور پیش‌فرض \fBfill\fP است .IP \(bu 2 نتیجه: \fB\-\-map\-by OBJ \-\-bind\-to OBJ \-\-rank\-by fill\fP .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 اگر \fB\-\-map\-by OBJ1 \-\-bind\-to OBJ2\fP باشد، آنگاه: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-map\-by\fP مقدار \fBOBJ1\fP مشخص‌شده .IP \(bu 2 \fB\-\-bind\-to\fP مقدار \fBOBJ2\fP مشخص‌شده .IP \(bu 2 \fB\-\-rank\-by\fP به طور پیش‌فرض \fBfill\fP است .IP \(bu 2 نتیجه: \fB\-\-map\-by OBJ2 \-\-bind\-to OBJ2 \-\-rank\-by fill\fP .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp دو میزبان یکسان (\fBhostA\fP و \fBhostB\fP) با ۲ بسته پردازنده (با علامت \fB[]\fP) را در نظر بگیرید که هر کدام ۸ هسته (با علامت \fB/../\fP) و ۲ ریسه سخت‌افزاری در هر هسته (با علامت \fB\&.\fP) دارند. .sp پیش‌فرض \fB\-\-map\-by core \-\-bind\-to core \-\-rank\-by span\fP زمانی که تعداد فرآیندها کمتر یا مساوی ۲ است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 2 \-\-host hostA:4,hostB:2 ./a.out R0 hostA [BB/../../../../../../..][../../../../../../../..] R1 hostA [../BB/../../../../../..][../../../../../../../..] .ft P .fi .UNINDENT .UNINDENT .sp پیش‌فرض \fB\-\-map\-by package \-\-bind\-to package \-\-rank\-by fill\fP زمانی که تعداد فرآیندها بیشتر از ۲ است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-host hostA:4,hostB:2 ./a.out R0 hostA [BB/BB/BB/BB/BB/BB/BB/BB][../../../../../../../..] R1 hostA [BB/BB/BB/BB/BB/BB/BB/BB][../../../../../../../..] R2 hostA [../../../../../../../..][BB/BB/BB/BB/BB/BB/BB/BB] R3 hostA [../../../../../../../..][BB/BB/BB/BB/BB/BB/BB/BB] .ft P .fi .UNINDENT .UNINDENT .sp اگر فقط \fB\-\-map\-by OBJ\fP مشخص شود، دلالت بر \fB\-\-bind\-to OBJ \-\-rank\-by fill\fP دارد. مثال زیر منجر به \fB\-\-map\-by hwthread \-\-bind\-to hwthread \-\-rank\-by fill\fP می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-map\-by hwthread \-\-host hostA:4,hostB:2 ./a.out R0 hostA [B./../../../../../../..][../../../../../../../..] R1 hostA [.B/../../../../../../..][../../../../../../../..] R0 hostA [../B./../../../../../..][../../../../../../../..] R1 hostA [../.B/../../../../../..][../../../../../../../..] .ft P .fi .UNINDENT .UNINDENT .sp اگر فقط \fB\-\-bind\-to OBJ\fP مشخص شود، \fB\-\-map\-by\fP بر اساس تعداد فرآیندها تعیین می‌شود و \fB\-\-rank\-by fill\fP اعمال می‌گردد. مثال زیر منجر به \fB\-\-map\-by package \-\-bind\-to core \-\-rank\-by fill\fP می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-bind\-to core \-\-host hostA:4,hostB:2 ./a.out R0 hostA [BB/../../../../../../..][../../../../../../../..] R1 hostA [../BB/../../../../../..][../../../../../../../..] R2 hostA [../../../../../../../..][BB/../../../../../../..] R3 hostA [../../../../../../../..][../BB/../../../../../..] .ft P .fi .UNINDENT .UNINDENT .sp الگوی نگاشت ممکن است بهتر دیده شود اگر \fB\-\-rank\-by\fP پیش‌فرض را از \fBfill\fP به \fBspan\fP تغییر دهیم. ابتدا، فرآیندها بر اساس بسته نگاشت می‌شوند و بین این دو با علامت‌گذاری یک هسته در هر بار چرخش می‌کنند. سپس، فرآیندها به روش گسترده (span) که بار آن‌ها را روی شیء نگاشت‌شده متعادل می‌کند، رتبه‌بندی می‌شوند. در نهایت، فرآیندها به هسته‌ای که به آن نگاشت شده بودند مقید می‌شوند: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-np 4 \-\-bind\-to core \-\-rank\-by span \-\-host hostA:4,hostB:2 ./a.out R0 hostA [BB/../../../../../../..][../../../../../../../..] R1 hostA [../../../../../../../..][BB/../../../../../../..] R2 hostA [../BB/../../../../../..][../../../../../../../..] R3 hostA [../../../../../../../..][../BB/../../../../../..] .ft P .fi .UNINDENT .UNINDENT .SS "فایل‌های رتبه (Rankfiles)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp فایل‌های رتبه‌بندی (Rankfiles) فایل‌های متنی هستند که اطلاعات دقیقی در مورد نحوه نگاشت فرآیندهای منفرد به گره‌ها و این‌که باید به کدام پردازنده(ها) مقید شوند، مشخص می‌کنند. هر خط از یک فایل رتبه‌بندی، مکان یک فرآیند را مشخص می‌کند (برای کارهای MPI، «رتبه» فرآیند به رتبه آن در \fBMPI_COMM_WORLD\fP اشاره دارد). شکل کلی هر خط در فایل رتبه‌بندی به صورت زیر است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C rank = slot= .ft P .fi .UNINDENT .UNINDENT .sp برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ cat myrankfile rank 0=aa slot=1:0\-2 rank 1=bb slot=0:0,1 rank 2=cc slot=2\-3 shell$ mpirun \-H aa,bb,cc,dd \-\-map\-by rankfile:file=myrankfile ./a.out .ft P .fi .UNINDENT .UNINDENT .sp به این معناست که: .INDENT 0.0 .IP \(bu 2 رتبه 0 در گره aa اجرا می‌شود، مقید به بسته منطقی 1، هسته‌های 0\-2. .IP \(bu 2 رتبه 1 در گره bb اجرا می‌شود، مقید به بسته منطقی 0، هسته‌های 0 و 1. .IP \(bu 2 رتبه 2 در گره cc اجرا می‌شود، مقید به هسته‌های منطقی 2 و 3. .UNINDENT .sp توجه داشته باشید که تنها مکان‌های منطقی پردازنده پشتیبانی می‌شوند. به طور پیش‌فرض، مقادیر مشخص‌شده هسته فرض می‌شوند. اگر قصد دارید ریسه‌های سخت‌افزاری خاصی را مشخص کنید، باید اصلاح‌کننده \fB:hwtcpus\fP را به گزینه خط فرمان \fB\-\-map\-by\fP اضافه کنید (مثلاً \fB\-\-map\-by rankfile:file=myrankfile:hwtcpus\fP). .sp اگر مشخصات مقیدسازی بین هر دو رتبه همپوشانی داشته باشد، خطایی رخ می‌دهد. اگر قصد دارید به فرآیندها اجازه دهید یک واحد پردازشی منطقی یکسان را به اشتراک بگذارند، باید گزینه خط فرمان \fB\-\-bind\-to :overload\-allowed\fP را ارسال کنید تا به سیستم زمان اجرا اعلام کند این بررسی را نادیده بگیرد. .sp نام‌های میزبان فهرست‌شده در بالا «مطلق» هستند، به این معنی که نام‌های میزبان واقعی و قابل حل مشخص شده‌اند. با این حال، نام‌های میزبان را می‌توان به صورت «نسبی» نیز مشخص کرد، یعنی نسبت به یک فهرست از نام‌های میزبان مشخص‌شده از خارج (مانند آرگومان \fB\-\-host\fP در \fBmpirun\fP، یک فایل میزبان یا زمان‌بند کار). .sp مشخصات «نسبی» به صورت \fB+n\fP است که در آن X یک عدد صحیح است که Xامین نام میزبان را در مجموعه تمام نام‌های میزبان موجود مشخص می‌کند که از 0 شماره‌گذاری شده است. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ cat myrankfile rank 0=+n0 slot=1:0\-2 rank 1=+n1 slot=0:0,1 rank 2=+n2 slot=2\-3 shell$ mpirun \-H aa,bb,cc,dd \-\-map\-by rankfile:file=myrankfile ./a.out .ft P .fi .UNINDENT .UNINDENT .sp تمام مکان‌های اسلات بسته/هسته به صورت شاخص‌های منطقی مشخص می‌شوند. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 سری Open MPI v1.6 از شاخص‌های فیزیکی استفاده می‌کرد. از Open MPI v5.0 تنها شاخص‌های منطقی پشتیبانی می‌شوند و پارامتر MCA با نام \fBrmaps_rank_file_physical\fP دیگر شناسایی نمی‌شود. .UNINDENT .UNINDENT .sp می‌توانید از ابزارهایی مانند \fIlstopo(1)\fP در Hwloc برای یافتن شاخص‌های منطقی بسته و هسته‌ها استفاده کنید. .SS "زمینه برنامه یا برنامه اجرایی؟ (Application Context or Executable Program?)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp برای تمایز بین این دو شکل مختلف، mpirun در خط فرمان به دنبال گزینه \fB\-\-app\fP می‌گردد. در صورت مشخص شدن آن، فرض می‌شود فایلی که در خط فرمان نام‌گذاری شده است، یک زمینه برنامه (Application Context) است. اگر مشخص نشده باشد، فرض می‌شود فایل یک برنامه اجرایی است. .SS "یافتن فایل‌ها (Locating Files)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp اگر هیچ مسیر نسبی یا مطلقی برای یک فایل مشخص نشده باشد، Open MPI ابتدا با جستجو در دایرکتوری‌های مشخص‌شده توسط گزینه \fB\-\-path\fP به دنبال فایل‌ها می‌گردد. اگر گزینه \fB\-\-path\fP تنظیم نشده باشد یا اگر فایل در مکان \fB\-\-path\fP پیدا نشود، آنگاه Open MPI متغیر محیطی \fBPATH\fP کاربر را همان‌طور که در گره(های) مبدأ تعریف شده است جستجو می‌کند. .sp اگر یک دایرکتوری نسبی مشخص شده باشد، باید نسبت به دایرکتوری کاری اولیه که توسط آغازگر خاص مورد استفاده تعیین شده است، نسبی باشد. به عنوان مثال هنگام استفاده از آغازگر ssh، دایرکتوری اولیه به طور پیش‌فرض \fB$HOME\fP است. سایر آغازگرها ممکن است دایرکتوری اولیه را روی دایرکتوری کاری جاری ناشی از فراخوانی \fBmpirun\fP تنظیم کنند. .SS "دایرکتوری کاری جاری (Current Working Directory)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp گزینه \fB\-\-wdir\fP در \fBmpirun\fP (و مترادف آن، \fB\-\-wd\fP) به کاربر امکان می‌دهد پیش از فراخوانی برنامه، به یک دایرکتوری دلخواه تغییر مسیر دهد. همچنین می‌توان از آن در فایل‌های زمینه برنامه برای تعیین دایرکتوری‌های کاری در گره‌های خاص و/یا برای برنامه‌های خاص استفاده کرد. .sp اگر گزینه \fB\-\-wdir\fP هم در یک فایل زمینه و هم در خط فرمان ظاهر شود، دایرکتوری فایل زمینه بر مقدار خط فرمان اولویت خواهد داشت. .sp اگر گزینه \fB\-wdir\fP مشخص شده باشد، Open MPI تلاش می‌کند در تمامی گره‌های راه دور به دایرکتوری مشخص‌شده تغییر مسیر دهد. در صورت عدم موفقیت، \fBmpirun\fP متوقف می‌شود. .sp اگر گزینه \fB\-wdir\fP مشخص نشده باشد، Open MPI نام دایرکتوری محل فراخوانی \fBmpirun\fP را به هر یک از گره‌های راه دور ارسال می‌کند. گره‌های راه دور تلاش می‌کنند به آن دایرکتوری تغییر مسیر دهند. اگر نتوانند (مثلاً اگر دایرکتوری در آن گره وجود نداشته باشد)، Open MPI از دایرکتوری پیش‌فرض تعیین‌شده توسط آغازگر استفاده خواهد کرد. .sp تمام تغییر دایرکتوری‌ها پیش از فراخوانی برنامه کاربر رخ می‌دهد؛ این فرآیند تا زمان فراخوانی \fI\%MPI_INIT(3)\fP منتظر نمی‌ماند. .SS "ورودی/خروجی استاندارد (Standard I/O)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp برنامه Open MPI ورودی استاندارد یونیکس (stdin) را در تمام فرآیندها به جز فرآیند با رتبه 0 در \fBMPI_COMM_WORLD\fP به \fB/dev/null\fP هدایت می‌کند. فرآیند رتبه 0 در \fBMPI_COMM_WORLD\fP ورودی استاندارد را از \fBmpirun\fP به ارث می‌برد. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 گره‌ای که \fBmpirun\fP را فراخوانی کرده نیازی نیست همان گره‌ای باشد که فرآیند رتبه 0 در \fBMPI_COMM_WORLD\fP در آن قرار دارد. Open MPI تغییر مسیر ورودی استاندارد \fBmpirun\fP به فرآیند رتبه 0 را مدیریت می‌کند. .UNINDENT .UNINDENT .sp برنامه Open MPI خروجی و خطای استاندارد یونیکس (stdout و stderr) را از گره‌های راه دور به گره‌ای که \fBmpirun\fP را فراخوانی کرده هدایت کرده و آن را در خروجی/خطای استاندارد \fBmpirun\fP چاپ می‌کند. فرآیندهای محلی خروجی/خطای استاندارد \fBmpirun\fP را به ارث برده و مستقیماً به آن انتقال می‌دهند. .sp بنابراین می‌توان ورودی/خروجی استاندارد را برای برنامه‌های Open MPI با استفاده از رویه متداول تغییر مسیر شل روی \fBmpirun\fP تغییر مسیر داد. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-n 2 my_app < my_input > my_output .ft P .fi .UNINDENT .UNINDENT .sp توجه داشته باشید که در این مثال تنها فرآیند رتبه 0 در \fBMPI_COMM_WORLD\fP جریان را از \fBmy_input\fP در stdin دریافت خواهد کرد. stdin در تمام گره‌های دیگر به \fB/dev/null\fP متصل خواهد شد. با این حال، stdout از تمام گره‌ها در فایل \fBmy_output\fP جمع‌آوری خواهد شد. .SS "انتشار سیگنال (Signal Propagation)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp هنگامی که \fBmpirun\fP سیگنال‌های SIGTERM و SIGINT را دریافت می‌کند، تلاش می‌کند تا کل کار را با ارسال یک SIGTERM به تمام فرآیندهای موجود در کار، انتظار برای چند ثانیه کوتاه، و سپس ارسال یک SIGKILL به تمام فرآیندهای کار متوقف کند. .sp سیگنال‌های SIGUSR1 و SIGUSR2 دریافت‌شده توسط \fBmpirun\fP به تمامی فرآیندهای موجود در کار منتشر می‌شوند. .sp یک سیگنال SIGTSTP به \fBmpirun\fP باعث ارسال سیگنال SIGSTOP به تمامی برنامه‌های راه‌اندازی‌شده توسط \fBmpirun\fP می‌شود و به همین ترتیب سیگنال SIGCONT به \fBmpirun\fP باعث ارسال SIGCONT خواهد شد. .sp سیگنال‌های دیگر در حال حاضر توسط \fBmpirun\fP منتشر نمی‌شوند. .SS "خاتمه فرآیند / رسیدگی به سیگنال (Process Termination / Signal Handling)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp در طول اجرای یک برنامه MPI، اگر هر فرآیندی به طور غیرعادی متوقف شود (یا پیش از فراخوانی \fI\%MPI_FINALIZE(3)\fP خارج شود، یا در نتیجه یک سیگنال بمیرد)، \fBmpirun\fP یک پیام خطا چاپ کرده و بقیه برنامه MPI را متوقف می‌کند. .sp گرداننده‌های سیگنال کاربر (Signal handlers) احتمالاً باید از تلاش برای پاک‌سازی وضعیت MPI خودداری کنند (Open MPI در حال حاضر از نظر سیگنال‌های ناهمگام ایمن نیست (async\-signal\-safe)؛ برای جزئیات درباره MPI_THREAD_MULTIPLE و ایمنی ریسه به \fI\%MPI_INIT_THREAD(3)\fP مراجعه کنید). برای مثال، اگر یک خطای دسترسی به حافظه (Segmentation fault) در \fI\%MPI_SEND(3)\fP رخ دهد (احتمالاً به دلیل ارسال یک بافر نامعتبر) و یک گرداننده سیگنال کاربر فراخوانی شود، اگر این گرداننده کاربر تلاش کند \fI\%MPI_FINALIZE(3)\fP را فراخوانی کند، ممکن است اتفاقات ناگواری رخ دهد زیرا Open MPI هنگام بروز خطا از قبل «درون» MPI بوده است. از آنجا که \fBmpirun\fP متوجه خواهد شد فرآیند به دلیل یک سیگنال متوقف شده است، احتمالاً برای کاربر نیازی نیست (و امن‌ترین حالت است) که فقط وضعیت‌های غیر MPI را پاک‌سازی کند. .SS "محیط فرآیند (Process Environment)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp فرآیندها در برنامه MPI محیط خود را از دیمن PRRTE موجود در گره‌ای که روی آن در حال اجرا هستند به ارث می‌برند. محیط معمولاً از شل کاربر به ارث برده می‌شود. در گره‌های راه دور، محیط دقیق توسط ماژول MCA راه‌انداز (Boot) مورد استفاده تعیین می‌شود. ماژول راه‌اندازی rsh، برای مثال، از rsh/ssh برای راه‌اندازی دیمن PRRTE در گره‌های راه دور استفاده می‌کند و معمولاً پیش از راه‌اندازی دیمن PRRTE، یک یا چند فایل راه‌اندازی شل کاربر را اجرا می‌نماید. هنگام اجرای برنامه‌های پیوندیافته پویا (Dynamically linked) که نیازمند تنظیم متغیر محیطی \fBLD_LIBRARY_PATH\fP هستند، باید دقت شود تا اطمینان حاصل شود که این متغیر هنگام بوت Open MPI به درستی تنظیم شده باشد. .sp برای جزئیات بیشتر بخش \fI\%اجرای از راه دور\fP را ببینید. .SS "اجرای از راه دور (Remote Execution)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp برنامه Open MPI نیاز دارد که متغیر محیطی \fBPATH\fP برای یافتن فایل‌های اجرایی در گره‌های راه دور تنظیم شده باشد (این موضوع معمولاً فقط در محیط‌های مبتنی بر rsh یا ssh ضروری است — محیط‌های دسته‌ای/زمان‌بندی‌شده معمولاً محیط فعلی را برای اجرای کارهای راه دور کپی می‌کنند، بنابراین اگر محیط فعلی \fBPATH\fP و/یا \fBLD_LIBRARY_PATH\fP را به درستی تنظیم کرده باشد، گره‌های راه دور نیز آن را به درستی تنظیم خواهند داشت). اگر Open MPI با پشتیبانی از کتابخانه‌های اشتراکی کامپایل شده باشد، ممکن است لازم باشد متغیر محیطی \fBLD_LIBRARY_PATH\fP نیز در گره‌های راه دور تنظیم شود (به ویژه برای یافتن کتابخانه‌های اشتراکی مورد نیاز برای اجرای برنامه‌های MPI کاربر). .sp با این حال، همیشه مطلوب یا ممکن نیست که فایل‌های راه‌اندازی شل برای تنظیم \fBPATH\fP و/یا \fBLD_LIBRARY_PATH\fP ویرایش شوند. گزینه \fB\-\-prefix\fP برای برخی از پیکربندی‌های ساده که در آن‌ها این کار امکان‌پذیر نیست فراهم شده است. .sp گزینه \fB\-\-prefix\fP یک آرگومان منفرد می‌گیرد: دایرکتوری پایه‌ای در گره راه دور که Open MPI در آن نصب شده است. Open MPI از این دایرکتوری برای تنظیم \fBPATH\fP و \fBLD_LIBRARY_PATH\fP راه دور پیش از اجرای هر برنامه Open MPI یا کاربر استفاده خواهد کرد. این امکان اجرای کارهای Open MPI را بدون نیاز به پیکربندی قبلی \fBPATH\fP و \fBLD_LIBRARY_PATH\fP در گره‌های راه دور فراهم می‌کند. .sp برنامه Open MPI نام پایه (Basename) دایرکتوری \fB$bindir\fP گره جاری (دایرکتوری محل نصب فایل‌های اجرایی Open MPI) را به پیشوند اضافه کرده و از آن برای تنظیم \fBPATH\fP در گره راه دور استفاده می‌کند. به طور مشابه، Open MPI نام پایه دایرکتوری \fB$libdir\fP گره جاری (دایرکتوری محل نصب کتابخانه‌های Open MPI) را به پیشوند اضافه کرده و از آن برای تنظیم \fBLD_LIBRARY_PATH\fP در گره راه دور استفاده می‌کند. برای مثال: .INDENT 0.0 .IP \(bu 2 دایرکتوری bin محلی: \fB/local/node/directory/bin\fP .IP \(bu 2 دایرکتوری lib محلی: \fB/local/node/directory/lib64\fP .UNINDENT .sp اگر از خط فرمان زیر استفاده شود: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-prefix /remote/node/directory .ft P .fi .UNINDENT .UNINDENT .sp برنامه Open MPI پیش از تلاش برای اجرای هر چیزی، \fB/remote/node/directory/bin\fP را به \fBPATH\fP و \fB/remote/node/directory/lib64\fP را به \fBLD_LIBRARY_PATH\fP در گره راه دور اضافه خواهد کرد. .sp گزینه \fB\-\-prefix\fP در صورتی که مسیرهای نصب در گره راه دور با گره محلی متفاوت باشد (برای مثال، اگر در گره محلی از \fB/lib\fP استفاده شود اما در گره راه دور از \fB/lib64\fP استفاده گردد)، یا اگر مسیرهای نصب چیزی غیر از یک زیردایرکتوری تحت یک پیشوند مشترک باشند، کافی نخواهد بود. .sp توجه داشته باشید که اجرای \fBmpirun\fP از طریق یک نام مسیر مطلق معادل تعیین \fB\-\-prefix\fP بدون آخرین زیردایرکتوری در مسیر مطلق به \fBmpirun\fP است. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ /usr/local/bin/mpirun ... .ft P .fi .UNINDENT .UNINDENT .sp معادل است با .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-prefix /usr/local .ft P .fi .UNINDENT .UNINDENT .SS "متغیرهای محیطی صادرشده (Exported Environment Variables)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp تمامی متغیرهای محیطی که به صورت \fBOMPI_*\fP نام‌گذاری شده‌اند به طور خودکار به فرآیندهای جدید در گره‌های محلی و راه دور صادر می‌شوند. پارامترهای محیطی را می‌توان با استفاده از پارامتر MCA با نام \fBmca_base_env_list\fP نیز برای فرآیندهای جدید تنظیم یا فوروارد کرد. گزینه \fB\-x\fP برای mpirun منسوخ شده است، اما نحو پارامتر MCA از همان مثال قبلی پیروی می‌کند. اگرچه نحو گزینه \fB\-x\fP و پارامتر MCA تعریف متغیرهای جدید را ممکن می‌سازد، توجه داشته باشید که تجزیه‌کننده این گزینه‌ها در حال حاضر چندان پیشرفته نیست — حتی مقادیر نقل‌قول‌شده را متوجه نمی‌شود. به کاربران توصیه می‌شود متغیرها را در محیط مقداردهی کنند و از این گزینه برای صادر کردن آن‌ها (نه تعریف آن‌ها) استفاده نمایند. .SS "تنظیم پارامترهای MCA (Setting MCA Parameters)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp سوییچ \fB\-\-mca\fP اجازه ارسال پارامترها به ماژول‌های مختلف MCA (معماری مؤلفه ماژولار یا Modular Component Architecture) را می‌دهد. ماژول‌های MCA تأثیر مستقیمی بر برنامه‌های MPI دارند زیرا به پارامترهای قابل تنظیم اجازه می‌دهند در زمان اجرا تنظیم شوند (مانند این‌که از کدام درایور دستگاه ارتباطی BTL استفاده شود، چه پارامترهایی به آن BTL ارسال شود و غیره). .sp سوییچ \fB\-\-mca\fP دو آرگومان می‌گیرد: \fB\fP و \fB\fP\&. آرگومان \fB\fP عموماً مشخص می‌کند که کدام ماژول MCA مقدار را دریافت خواهد کرد. به عنوان مثال، \fB\fP با مقدار \fBbtl\fP برای انتخاب BTL مورد استفاده در انتقال پیام‌های MPI استفاده می‌شود. آرگومان \fB\fP مقداری است که ارسال می‌شود. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-mca btl tcp,self \-n 1 my_mpi_app .ft P .fi .UNINDENT .UNINDENT .sp این دستور به Open MPI می‌گوید که از BTLهای \fBtcp\fP و \fBself\fP استفاده کند و یک نسخه تکی از \fBmy_mpi_app\fP را در یک گره تخصیص‌یافته اجرا نماید. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-\-mca btl self \-n 1 my_mpi_app .ft P .fi .UNINDENT .UNINDENT .sp به Open MPI می‌گوید از BTL با نام \fBself\fP استفاده کند و یک نسخه تکی از \fBmy_mpi_app\fP را در یک گره تخصیص‌یافته اجرا نماید. .sp سوییچ \fB\-\-mca\fP را می‌توان چندین بار برای تعیین آرگومان‌های مختلف و/یا \fB\fP استفاده کرد. اگر یک \fB\fP یکسان بیش از یک بار مشخص شود، مقادیر \fB\fP با یک کاما (\fP,\(ga\(ga) جداکننده به هم متصل می‌شوند. .sp توجه داشته باشید که سوییچ \fB\-\-mca\fP صرفاً یک میانبر برای تنظیم متغیرهای محیطی است. همین اثر را می‌توان با تنظیم متغیرهای محیطی متناظر پیش از اجرای \fBmpirun\fP به دست آورد. شکل متغیرهای محیطی که Open MPI تنظیم می‌کند به این صورت است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C OMPI_MCA_= .ft P .fi .UNINDENT .UNINDENT .sp بنابراین، سوییچ \fB\-\-mca\fP هرگونه متغیر محیطی از قبل تنظیم‌شده را لغو و بازنویسی می‌کند. تنظیمات \fB\-\-mca\fP به طور مشابه پارامترهای MCA تنظیم‌شده در فایل \fB$OPAL_PREFIX/etc/openmpi\-mca\-params.conf\fP یا \fB$HOME/.openmpi/mca\-params.conf\fP را بازنویسی می‌کنند. .sp آرگومان‌های ناشناخته \fB\fP همچنان به عنوان متغیر محیطی تنظیم می‌شوند — صحت آن‌ها (توسط mpirun) بررسی نمی‌شود. آرگومان‌های غیرمجاز یا نادرست \fB\fP ممکن است گزارش شوند یا نشوند — این امر به ماژول خاص MCA بستگی دارد. .sp برای یافتن انواع مؤلفه‌های موجود تحت معماری MCA یا یافتن پارامترهای موجود برای یک مؤلفه خاص، از دستور ompi_info استفاده کنید. برای اطلاعات دقیق در مورد این دستور به صفحه راهنمای \fI\%ompi_info(1)\fP مراجعه فرمایید. .SS "تنظیم پارامترهای MCA و متغیرهای محیطی از طریق فایل (Setting MCA parameters and environment variables from file)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp گزینه خط فرمان \fB\-\-tune\fP و مترادف آن \fB\-\-mca\fP \fBmca_base_envar_file_prefix\fP به کاربر اجازه می‌دهد پارامترهای MCA و متغیرهای محیطی را با نحو توضیح‌داده‌شده در زیر تنظیم کند. این گزینه نیازمند یک فایل منفرد یا فهرستی از فایل‌های جداشده با «,» در ادامه است. .sp یک خط معتبر در فایل ممکن است شامل صفر یا چند \fB\-x\fP یا \fB\-\-mca\fP باشد. الگوهای زیر پشتیبانی می‌شوند: .INDENT 0.0 .IP \(bu 2 \fB\-\-mca var val\fP .IP \(bu 2 \fB\-\-mca var "val"\fP .IP \(bu 2 \fB\-x var=val\fP .IP \(bu 2 \fB\-x var\fP .UNINDENT .sp اگر آرگومانی در فایل تکرار شود، آخرین مقدار خوانده‌شده استفاده خواهد شد. .sp پارامترهای MCA و متغیرهای محیطی مشخص‌شده در خط فرمان اولویت بالاتری نسبت به متغیرهای مشخص‌شده در فایل دارند. .SS "اجرا به عنوان ریشه (Running as root)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp \fBهشدار (WARNING):\fP .INDENT 0.0 .INDENT 3.5 تیم Open MPI \fBاکیداً\fP اجرای \fBmpirun\fP را توسط کاربر ریشه (root) منع می‌کند. برنامه‌های MPI باید به عنوان کاربران عادی (غیر ریشه) اجرا شوند. .UNINDENT .UNINDENT .sp دستور \fBmpirun\fP به طور پیش‌فرض از اجرا به عنوان ریشه خودداری می‌کند. .sp برای لغو این پیش‌فرض، می‌توانید گزینه \fB\-\-allow\-run\-as\-root\fP را به خط فرمان mpirun اضافه کنید، یا می‌توانید پارامترهای محیطی \fBOMPI_ALLOW_RUN_AS_ROOT=1\fP و \fBOMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1\fP را تنظیم نمایید. توجه داشته باشید که تنظیم دو متغیر محیطی برای اعمال رفتاری مشابه با \fB\-\-allow\-run\-as\-root\fP به منظور تأکید بر توصیه اکید تیم Open MPI مبنی بر عدم اجرا به عنوان کاربر ریشه در نظر گرفته شده است. .sp پس از بحث‌های گسترده با جوامعی که از کانتینرها استفاده می‌کنند (که در آن‌ها اجرا به عنوان کاربر ریشه پیش‌فرض است)، تمایل مداومی برای امکان فعال کردن اجرای ریشه در \fBmpirun\fP از طریق کنترل محیطی (در مقایسه با پارامتر خط فرمان موجود \fB\-\-allow\-run\-as\-root\fP) وجود داشت. راه‌حل میانه استفاده از دو متغیر محیطی اتخاذ شد: این کار امکان اجرای ریشه را از طریق کنترل محیطی فراهم می‌کند، اما توصیه اکید تیم Open MPI را علیه این رفتار منتقل می‌سازد. .SS "وضعیت خروج (Exit status)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp هیچ تعریف استانداردی برای آن‌چه \fBmpirun\fP باید به عنوان وضعیت خروج برگرداند وجود ندارد. پس از بحث‌های قابل توجه، ما روش زیر را برای تخصیص وضعیت خروج \fBmpirun\fP تعیین کردیم (نکته: در توضیحات زیر، کار «اصلی» برنامه اولیه‌ای است که توسط mpirun آغاز شده است — تمام کارهایی که توسط آن کار ایجاد می‌شوند کارهای «فرعی» نامیده می‌شوند): .INDENT 0.0 .IP \(bu 2 اگر تمام فرآیندها در کار اصلی به طور معمول با وضعیت خروج 0 خاتمه یابند، \fBmpirun\fP مقدار 0 را برمی‌گرداند. .IP \(bu 2 اگر یک یا چند فرآیند در کار اصلی به طور معمول با وضعیت خروج غیرصفر خاتمه یابند، \fBmpirun\fP وضعیت خروج فرآیندی با پایین‌ترین رتبه \fBMPI_COMM_WORLD\fP را که وضعیت غیرصفر دارد برمی‌گرداند. .IP \(bu 2 اگر تمام فرآیندها در کار اصلی به طور معمول با وضعیت خروج 0 خاتمه یابند، و یک یا چند فرآیند در یک کار فرعی به طور معمول با وضعیت خروج غیرصفر خاتمه یابند، \fBmpirun\fP: .INDENT 2.0 .IP 1. 3 وضعیت خروج فرآیند با پایین‌ترین رتبه \fBMPI_COMM_WORLD\fP در پایین‌ترین jobid که دارای وضعیت غیرصفر است را برمی‌گرداند، و .IP 2. 3 پیامی را چاپ می‌کند که وضعیت خروج کار اصلی و تمام کارهای فرعی را خلاصه می‌نماید. .UNINDENT .IP \(bu 2 اگر گزینه خط فرمان \fB\-\-report\-child\-jobs\-separately\fP تنظیم شده باشد، ما \fIفقط\fP وضعیت خروج کار اصلی را برمی‌گردانیم. هرگونه وضعیت خروج غیرصفر در کارهای فرعی صرفاً در یک گزاره چاپی خلاصه‌شده گزارش خواهد شد. .UNINDENT .sp به طور پیش‌فرض، زمانی که هر فرآیندی با وضعیت غیرصفر خاتمه یابد، کل کار لغو می‌شود. پارامتر MCA با نام \fB\-\-prtemca state_base_error_non_zero_exit\fP را می‌توان روی «false» (یا «0») تنظیم کرد تا در صورت بازگشت وضعیت غیرصفر توسط یک یا چند فرآیند، باعث لغو کار توسط Open MPI نشود. در این شرایط، Open MPI خروج فرآیندها با وضعیت خاتمه غیرصفر را ثبت کرده و وضعیت خروج مناسب \fBmpirun\fP را (طبق موارد فوق) گزارش می‌دهد. .SH "مثال‌ها (EXAMPLES)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp حتماً مثال‌های موجود در تمامی بخش‌های بالا را نیز مشاهده فرمایید. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C shell$ mpirun \-n 4 \-\-mca btl tcp,sm,self prog1 .ft P .fi .UNINDENT .UNINDENT .sp اجرای ۴ نسخه از \fBprog1\fP با استفاده از BTLهای \fBtcp\fP، \fBsm\fP (حافظه اشتراکی) و \fBself\fP (لوپ‌بک فرآیند) برای انتقال پیام‌های MPI. .SH "مقدار بازگشتی (RETURN VALUE)" .INDENT 0.0 .INDENT 3.5 .IP "این محتوای قدیمی و کدگذاری‌شده دستی است" .sp آیا این محتوا هنوز به‌روز و دقیق است؟ آیا باید به‌روزرسانی و حفظ شود یا حذف گردد؟ .UNINDENT .UNINDENT .sp دستور \fBmpirun\fP در صورتی که تمام فرآیندهای آغازشده توسط mpirun پس از فراخوانی \fI\%MPI_FINALIZE(3)\fP خارج شوند، مقدار 0 را برمی‌گرداند. اگر خطای داخلی در mpirun رخ دهد، یا یک یا چند فرآیند قبل از فراخوانی \fI\%MPI_FINALIZE(3)\fP خارج شوند، یک مقدار غیرصفر بازگردانده می‌شود. اگر خطای داخلی در mpirun رخ دهد، کد خطای مربوطه بازگردانده می‌شود. در صورتی که یک یا چند فرآیند قبل از فراخوانی \fI\%MPI_FINALIZE(3)\fP خارج شوند، مقدار بازگشتی رتبه \fBMPI_COMM_WORLD\fP فرآیندی که mpirun ابتدا متوجه توقف آن قبل از فراخوانی \fI\%MPI_FINALIZE(3)\fP شده است، بازگردانده خواهد شد. توجه داشته باشید که به طور کلی، این اولین فرآیندی خواهد بود که متوقف شده است اما تضمینی برای آن وجود ندارد. .sp اگر از گزینه خط فرمان \fB\-\-timeout\fP استفاده شود و مهلت زمانی قبل از اتمام کار منقضی گردد (و در نتیجه mpirun مجبور به لغو کار شود)، mpirun یک وضعیت خروج معادل مقدار ETIMEDOUT (که در سیستم‌های لینوکس و OS X معمولاً ۱۱۰ است) برمی‌گرداند. .sp \fBهمچنین ببینید (SEE ALSO):\fP .INDENT 0.0 .INDENT 3.5 \fI\%MPI_INIT(3)\fP, \fI\%MPI_INIT_THREAD(3)\fP, \fI\%MPI_FINALIZE(3)\fP, \fI\%ompi_info(1)\fP .UNINDENT .UNINDENT .SH "حق نشر (COPYRIGHT)" 2003-2026, The Open MPI Community .\" Generated by docutils manpage writer. .