| MPIRUN(1) | Open MPI | MPIRUN(1) |
نام (NAME)
mpirun - اجرای کارهای ترتیبی و موازی در Open MPI
NOTE:
خلاصه دستور (SYNOPSIS)
مدل تکفرآیند با دادههای چندگانه (SPMD):
mpirun [ options ] <program> [ <args> ]
مدل دستورات چندگانه با دادههای چندگانه (MIMD):
mpirun [ global_options ]
[ local_options1 ] <program1> [ <args1> ] :
[ local_options2 ] <program2> [ <args2> ] :
... :
[ local_optionsN ] <programN> [ <argsN> ]
توجه داشته باشید که در هر دو مدل، فراخوانی mpirun از طریق مسیر مطلق معادل تعیین گزینه --prefix با مقدار <dir> برابر با دایرکتوری محل قرارگیری mpirun منهای آخرین زیردایرکتوری آن است. برای مثال:
shell$ /usr/local/bin/mpirun ...
معادل است با
shell$ mpirun --prefix /usr/local
خلاصه سریع (QUICK SUMMARY)
اگر صرفاً به دنبال نحوه اجرای یک برنامه MPI هستید، احتمالاً میخواهید از خط فرمانی به شکل زیر استفاده کنید:
shell$ mpirun [ -n X ] [ --hostfile <filename> ] <program>
این دستور X نسخه از <program> را در محیط زمان اجرای فعلی شما اجرا میکند (اگر تحت یک مدیر منابع پشتیبانیشده اجرا شود، mpirun در Open MPI معمولاً به طور خودکار از آغازگر فرآیند مدیر منابع مربوطه استفاده میکند، بر خلاف مثلاً ssh که نیاز به استفاده از فایل میزبان دارد، یا به طور پیشفرض تمام X نسخه را روی لوکالهاست اجرا میکند)، و زمانبندی (بهطور پیشفرض) را به صورت نوبتگردشی بر اساس اسلات CPU انجام میدهد. برای جزئیات بیشتر به ادامه این مستندات مراجعه کنید.
لطفاً توجه داشته باشید که mpirun فرآیندها را به طور خودکار به منابع سختافزاری مقید میکند. در غیاب هرگونه دستورالعمل اضافی، از سه الگوی مقیدسازی استفاده میشود (برای جزئیات بیشتر به بخش پیشفرضهای نگاشت/رتبهبندی/مقیدسازی مراجعه کنید):
- مقیدسازی به هسته (Bind to core): زمانی که تعداد فرآیندها ۲ => باشد
- مقیدسازی به بسته پردازنده (Bind to package): زمانی که تعداد فرآیندها > ۲ باشد
- عدم مقیدسازی (Bind to none): در صورت اشتراک بیش از حد (Oversubscribed)
اگر برنامه شما از ریسهها (تردها) استفاده میکند، احتمالاً میخواهید اطمینان حاصل کنید که یا اصلاً مقید نشدهاید (با مشخص کردن --bind-to none) یا با استفاده از یک سطح مقیدسازی مناسب یا تعداد مشخصی از عناصر پردازشی برای هر فرآیند برنامه، به چندین هسته مقید شدهاید.
استفاده OPEN MPI از PRRTE (OPEN MPI’S USE OF PRRTE)
Open MPI از محیط زمان اجرای مرجع PMIx (یا PRRTE) به عنوان موتور اصلی برای راهاندازی، نظارت و خاتمه دادن به فرآیندهای MPI استفاده میکند.
بخش عمدهای از مستندات زیر مستقیماً از PRRTE وارد شده است. از این رو، مکرراً به مفاهیم و گزینههای خط فرمان PRRTE اشاره میکند. به جز موارد ذکر شده، این مفاهیم و آرگومانهای خط فرمان همگی برای Open MPI نیز قابل اعمال هستند. Open MPI گزینههای خط فرمان موجود PRRTE را گسترش میدهد و همچنین در چند مورد رفتارهای پیشفرض PRRTE را اندکی تغییر میدهد. این موارد به طور مشخص در مستندات زیر توضیح داده خواهند شد.
گزینههای خط فرمان (COMMAND LINE OPTIONS)
هسته پردازش mpirun در Open MPI از طریق PRRTE انجام میشود. به طور مشخص: mpirun در واقع یک پوشش دور prterun است، اما گزینههای خط فرمان mpirun اندکی با دستورات خط فرمان PRRTE تفاوت دارد.
بدون محتوا (No content)
محتوای معناداری در این بخش وجود ندارد زیرا Open MPI یا:
- بدون پشتیبانی از PRRTE ساخته شده است.
- با نسخهای از PRRTE ساخته شده است که بیش از حد قدیمی بوده و مستندات خوانا برای ماشین را که بتوان در مستندات Open MPI گنجاند، شامل نمیشده است.
اگر Open MPI را با نسخه جدیدتری از PRRTE بسازید (و ابزار Sphinx هنگام اجرای دستور configure در دسترس باشد)، باید مستندات معنادارتری را در اینجا دریافت کنید.
از این رو، مستنداتی برای این بخش وجود ندارد.
با عرض پوزش!
گزینهها (OPTIONS)
- این محتوای قدیمی است
-
این بخش قدیمی از محتوای دستی کدگذاریشده است. احتمالاً باید بررسی و بازبینی شود تا مشخص گردد چه مواردی را میخواهیم نگه داریم و چه مواردی را باید کنار بگذاریم.
میتوانید به جای تکرار محتوا در اینجا، به https://docs.prrte.org مراجعه کنید (برای مثال برای تعریف اسلات و موارد دیگر).
دستور mpirun نام دایرکتوری محل فراخوانی خود در گره محلی را به هر یک از گرههای از راه دور ارسال کرده و تلاش میکند به آن دایرکتوری تغییر مسیر دهد. برای جزئیات بیشتر به بخش «دایرکتوری کاری جاری» در ادامه مراجعه کنید.
- <program>: فایل اجرایی برنامه. این مورد به عنوان اولین آرگومان ناشناخته برای mpirun شناسایی میشود.
- <args>: ارسال این آرگومانهای زمان اجرا به هر فرآیند جدید. این موارد باید همیشه آخرین آرگومانها به mpirun باشند. در صورت استفاده از فایل زمینه برنامه (App context)، <args> نادیده گرفته خواهد شد.
- -h، --help: نمایش راهنما برای این دستور.
- -q، --quiet: سرکوب پیامهای اطلاعاتی از orterun در طول اجرای برنامه.
- -v، --verbose: خروجی با جزئیات کامل (پرحرف).
- -V، --version: چاپ شماره نسخه. اگر آرگومان دیگری داده نشود، این گزینه همچنین باعث خروج orterun خواهد شد.
- -N <num>: راهاندازی num فرآیند در هر گره روی تمام گرههای تخصیصیافته (مترادف --npernode).
- --display-map: نمایش جدولی که مکان نگاشتشده هر فرآیند را پیش از راهاندازی نشان میدهد.
- --display-allocation: نمایش تخصیص منابع شناساییشده.
- --output-proctable: خروجی جدول فرآیندهای دیباگر پس از راهاندازی.
- --dvm: ایجاد یک ماشین مجازی توزیعشده دائمی (DVM).
- --max-vm-size <size>: تعداد دیمنهایی که باید راهاندازی شوند.
برای تعیین اینکه کدام میزبانها (گرهها) از کلاستر باید برنامه را اجرا کنند، از یکی از گزینههای زیر استفاده کنید. توجه داشته باشید که از ابتدای نسخه v1.8، mpirun در ابتدای اجرا روی تکتک میزبانهای موجود در تخصیص (طبق تغییرات ایجادشده توسط گزینههای زیر) یک دیمن راهاندازی میکند، صرفنظر از اینکه فرآیندهای برنامه در نهایت برای اجرا در آنجا نگاشت شوند یا خیر. این کار برای امکانپذیر شدن جمعآوری اطلاعات توپولوژی سختافزاری از گرههای راه دور انجام میشود تا بتوان فرآیندها را بر اساس توپولوژی شناختهشده نگاشت کرد. با این حال، این یک تغییر رفتاری نسبت به نسخههای قبلی است که در آنها دیمنها تنها پس از تکمیل نگاشت راهاندازی میشدند و بنابراین فقط در گرههایی اجرا میشدند که فرآیندهای برنامه واقعاً در آنجا اجرا میشدند.
- -H، --host <host1,host2,...,hostN>: فهرستی از میزبانهایی که فرآیندها باید روی آنها فراخوانی شوند.
- --hostfile <hostfile>: ارائه یک فایل میزبان برای استفاده.
- --default-hostfile <hostfile>: ارائه یک فایل میزبان پیشفرض.
- --machinefile <machinefile>: مترادف برای --hostfile.
- --cpu-set <list>: محدود کردن فرآیندهای راهاندازیشده به CPUهای منطقی مشخصشده در هر گره (فهرست جداشده با کاما). توجه داشته باشید که گزینههای مقیدسازی همچنان در محدوده مشخصشده اعمال خواهند شد — برای مثال، میتوانید انتخاب کنید که هر فرآیند را فقط به یک CPU در مجموعه CPUهای مشخصشده مقید کنید.
گزینههای زیر تعداد فرآیندها را برای راهاندازی مشخص میکنند. توجه داشته باشید که هیچیک از گزینهها دلالت بر یک سیاست مقیدسازی خاص ندارند — برای مثال، درخواست N فرآیند برای هر بسته پردازنده به این معنی نیست که فرآیندها به آن بسته مقید خواهند شد.
- •
- -n، --n، -c، -np
<#>: اجرای
این تعداد
نسخه از
برنامه در
گرههای
دادهشده.
این گزینه
نشان
میدهد که
فایل
مشخصشده
یک برنامه
اجرایی است
و نه یک
زمینه
برنامه. اگر
مقداری
برای تعداد
نسخههای
اجرایی
ارائه نشود
(یعنی نه -n و
نه
مترادفهای
آن در خط
فرمان
ارائه
نشوند)، Open MPI
به طور
خودکار یک
نسخه از
برنامه را
روی هر
اسلات
فرآیند
اجرا
میکند
(برای توضیح
«اسلات
فرآیند» به
تعریف
اسلات در PRRTE
مراجعه
کنید). با
این حال،
این ویژگی
فقط در مدل SPMD
قابل
استفاده
است و در
غیر این
صورت (بدون
شروع اجرای
برنامه) خطا
برمیگرداند.
NOTE:
- --map-by ppr:N:<object>: راهاندازی N برابر تعداد اشیاء از نوع مشخصشده در هر گره.
- --npersocket <#persocket>: در هر گره، این تعداد فرآیند را ضرب در تعداد سوکتهای پردازنده در گره راهاندازی میکند. گزینه -npersocket همچنین گزینه --bind-to-socket را فعال میکند. (منسوخ شده به نفع --map-by ppr:n:package)
- --npernode <#pernode>: در هر گره، این تعداد فرآیند را راهاندازی میکند. (منسوخ شده به نفع --map-by ppr:n:node).
- --pernode: در هر گره، یک فرآیند راهاندازی میکند — معادل --npernode 1. (منسوخ شده به نفع --map-by ppr:1:node)
برای نگاشت فرآیندها:
- •
- --map-by <object>: نگاشت به شیء مشخصشده، پیشفرض package است. گزینههای پشتیبانیشده عبارتند از slot، hwthread، core، L1cache، L2cache، L3cache، package، numa، node، seq، rankfile، pe-list=# و ppr. هر شیء میتواند با افزودن یک : و هر ترکیبی از موارد زیر، شامل اصلاحکنندهها باشد:
- pe=n: مقید کردن n عنصر پردازشی به هر فرآیند
- span: تعادل بار فرآیندها در سراسر تخصیص
- oversubscribe: اجازه فرآیندهای بیشتر در یک گره نسبت به عناصر پردازشی
- nooversubscribe: اجازه ندادن به فرآیندهای بیشتر در یک گره نسبت به عناصر پردازشی (پیشفرض)
- nolocal: قرار ندادن فرآیندها در همان میزبان فرآیند mpirun
- hwtcpus: استفاده از ریسههای سختافزاری به عنوان اسلاتهای CPU برای نگاشت
- corecpus: استفاده از هستههای پردازنده به عنوان اسلاتهای CPU برای نگاشت (پیشفرض)
- file=filename: استفاده همراه با rankfile؛ استفاده از filename برای مشخص کردن فایل مورد نظر
- ordered: استفاده همراه با pe-list برای مقید کردن هر فرآیند به یکی از عناصر پردازشی مشخصشده
NOTE:
- --bycore: نگاشت فرآیندها بر اساس هسته (منسوخ شده به نفع --map-by core).
- --byslot: نگاشت و رتبهبندی فرآیندها به صورت نوبتگردشی بر اساس اسلات (منسوخ شده به نفع --map-by slot).
- --nolocal: عدم اجرای هیچ نسخهای از برنامه راهاندازیشده در همان گرهای که orterun در حال اجرا است. این گزینه تعیین لوکالهاست را با --host یا هر سازوکار تعیین میزبان دیگری بازنویسی و لغو میکند. نام مستعار برای --map-by :nolocal.
- --nooversubscribe: عدم اشتراک بیش از حد در هر یک از گرهها؛ در صورتی که تعداد فرآیندهای درخواستی باعث اشتراک بیش از حد شود، خطا میدهد (بدون شروع هیچ فرآیندی). این گزینه به طور ضمنی «max_slots» را برابر با مقدار «slots» برای هر گره قرار میدهد. (بهطور پیشفرض فعال است). نام مستعار برای --map-by :nooversubscribe.
- --oversubscribe: اجازه اشتراک بیش از حد به گرهها، حتی در یک سیستم مدیریتشده، و بارگذاری بیش از حد عناصر پردازشی داده میشود. نام مستعار برای --map-by :oversubscribe.
- --bynode: راهاندازی فرآیندها به صورت یکی در هر گره، با چرخش بین گرهها به شیوه نوبتگردشی. این کار فرآیندها را به طور یکنواخت بین گرهها پخش میکند و رتبههای MPI_COMM_WORLD را به صورت نوبتگردشی بر اساس گره تخصیص میدهد. (منسوخ شده به نفع --map-by node)
- --cpu-list <cpus>: فهرست
جداشده با
کاما از
شناسههای
پردازنده
که
فرآیندها
باید به
آنها مقید
شوند
[پیشفرض=``NULL``].
شناسههای
پردازنده
به عنوان
شناسههای
منطقی هسته
hwloc تفسیر
میشوند.
NOTE:
برای مرتبسازی رتبههای فرآیندها در MPI_COMM_WORLD:
- •
- --rank-by <mode>: رتبهبندی به شیوه نوبتگردشی بر اساس حالت مشخصشده، پیشفرض slot است. گزینههای پشتیبانیشده شامل slot، node، fill و span هستند.
برای مقیدسازی فرآیند:
- --bind-to <object>: مقید کردن فرآیندها به شیء مشخصشده، پیشفرض core است. گزینههای پشتیبانیشده شامل slot، hwthread، core، l1cache، l2cache، l3cache، package، numa و none هستند.
- --cpus-per-proc <#perproc>: مقید کردن هر فرآیند به تعداد مشخصی از CPUها. (منسوخ شده به نفع --map-by <obj>:PE=n)
- --cpus-per-rank <#perrank>: نام مستعار برای --cpus-per-proc. (منسوخ شده به نفع --map-by <obj>:PE=n)
- --bind-to-core: مقید کردن فرآیندها به هستهها (منسوخ شده به نفع --bind-to core)
- --bind-to-socket: مقید کردن فرآیندها به سوکتهای پردازنده (منسوخ شده به نفع --bind-to package)
- --report-bindings: گزارش هرگونه مقیدسازی برای فرآیندهای راهاندازیشده.
برای فایلهای رتبهبندی (Rankfiles):
- •
- --rankfile <rankfile>: ارائه یک فایل رتبهبندی. (منسوخ شده به نفع --map-by rankfile:file=FILE)
برای مدیریت ورودی/خروجی استاندارد:
- --output-filename <filename>: تغییر مسیر stdout، stderr و stddiag تمام فرآیندها به نسخه منحصربهفرد از نام فایل مشخصشده برای هر فرآیند. هر دایرکتوری در نام فایل به طور خودکار ایجاد خواهد شد. هر فایل خروجی شامل filename.id خواهد بود که در آن id رتبه فرآیند در MPI_COMM_WORLD است که برای مرتبسازی صحیح در فهرستها، با صفر از سمت چپ پر شده است. مقدار مسیر نسبی بر اساس دایرکتوری کاری جاری (cwd) محل اجرای mpirun به یک مسیر مطلق تبدیل خواهد شد. توجه داشته باشید که این گزینه در محیطهایی که سیستم فایل در گرههای محاسباتی با محیط محل اجرای mpirun(1) تفاوت دارد، کار نخواهد کرد.
- --stdin <rank>: رتبه MPI_COMM_WORLD فرآیندی که باید stdin را دریافت کند. مقدار پیشفرض، فوروارد کردن stdin به رتبه 0 در MPI_COMM_WORLD است، اما این گزینه میتواند برای فوروارد کردن stdin به هر فرآیندی استفاده شود. همچنین مشخص کردن none به نشانه عدم دریافت stdin توسط هیچ فرآیندی مجاز است.
- --merge-stderr-to-stdout: ادغام کردن stderr در stdout برای هر فرآیند.
- --tag-output: برچسبگذاری هر خط خروجی به stdout، stderr و stddiag با [jobid, MCW_rank]<stdxxx> که نشاندهنده شناسه کار (jobid) فرآیند و رتبه MPI_COMM_WORLD فرآیند تولیدکننده خروجی و کانال تولیدکننده آن است.
- --timestamp-output: ثبت برچسب زمان (Timestamp) برای هر خط خروجی به stdout، stderr و stddiag.
- --xml: ارائه تمام خروجیها به stdout، stderr و stddiag در قالب XML.
- --xml-file <filename>: ارائه تمام خروجیها در قالب XML به فایل مشخصشده.
- --xterm <ranks>: نمایش
خروجی
فرآیندهای
مشخصشده
بر اساس
رتبههای
MPI_COMM_WORLD آنها
در
پنجرههای
مجزای xterm.
رتبهها به
صورت
فهرستی از
بازهها با
کاما مشخص
میشوند که
در آن -1
نشاندهنده
همه است.
برای هر
فرآیند
مشخصشده
یک پنجره
جداگانه
ایجاد
خواهد شد.
NOTE:
نکته: در برخی محیطها، xterm ممکن است نیاز داشته باشد که فایل اجرایی در مسیر (PATH) کاربر باشد، یا به صورت مطلق یا نسبی مشخص شود. بنابراین، ممکن است لازم باشد یک فایل اجرایی محلی به عنوان ./my_mpi_app به جای صرفاً my_mpi_app مشخص شود. اگر xterm نتواند فایل اجرایی را پیدا کند، mpirun متوقف (Hang) خواهد شد، اما همچنان به ctrl-C به درستی پاسخ میدهد. در صورت وقوع این اتفاق، لطفاً بررسی کنید که فایل اجرایی به درستی مشخص شده باشد و دوباره امتحان کنید.
برای مدیریت فایلها و محیط زمان اجرا:
- --path <path>: مقدار <path> که در هنگام تلاش برای یافتن فایلهای اجرایی درخواستی استفاده خواهد شد. این گزینه پیش از بررسی متغیر محیطی محلی PATH به کار میرود.
- --prefix <dir>: دایرکتوری پیشوندی که برای تنظیم PATH و LD_LIBRARY_PATH در گره راه دور پیش از فراخوانی Open MPI یا فرآیند هدف استفاده خواهد شد. بخش اجرای از راه دور را در ادامه ببینید.
- --noprefix: غیرفعال کردن رفتار خودکار --prefix.
- --preload-binary: کپی کردن فایل(های) اجرایی مشخصشده به ماشینهای راه دور پیش از شروع فرآیندهای راه دور. فایلهای اجرایی در دایرکتوری نشست Open MPI کپی شده و پس از اتمام کار حذف خواهند شد.
- --preload-files <files>: بارگذاری اولیه فهرست جداشده با کاما از فایلها در دایرکتوری کاری جاری ماشینهای راه دور پیش از شروع فرآیندها.
- --set-cwd-to-session-dir: تنظیم دایرکتوری کاری فرآیندهای راهاندازیشده بر روی دایرکتوری نشست آنها.
- --wd <dir>: مترادف برای -wdir.
- --wdir <dir>: تغییر مسیر به دایرکتوری <dir> پیش از اجرای برنامه کاربر. برای نکات مربوط به مسیرهای نسبی به بخش دایرکتوری کاری جاری مراجعه کنید. نکته: اگر گزینه --wdir هم در خط فرمان و هم در زمینه برنامه وجود داشته باشد، زمینه برنامه بر خط فرمان اولویت خواهد داشت. بنابراین، اگر مسیر دایرکتوری کاری مورد نظر در گرههای پسزمینه متفاوت است، باید به عنوان یک مسیر مطلق که برای گره پسزمینه صحیح است، مشخص شود.
- -x <env>: صادر کردن متغیرهای محیطی مشخصشده به گرههای راه دور پیش از اجرای برنامه. در هر گزینه -x تنها میتوان یک متغیر محیطی را مشخص کرد. میتوان متغیرهای محیطی موجود را مشخص نمود یا نامهای جدید متغیر را با مقادیر متناظر تعیین کرد. برای مثال:
shell$ mpirun -x DISPLAY -x OFILE=/tmp/out ...
تجزیهکننده گزینه -x چندان پیچیده نیست؛ حتی مقادیر نقلقولشده را نمیپذیرد. به کاربران توصیه میشود ابتدا متغیرها را در محیط مقداردهی کنند و سپس از -x برای صادر کردن (نه تعریف کردن) آنها استفاده نمایند.
تنظیم پارامترهای MCA:
- --gmca <key> <value>: ارسال پارامترهای عمومی MCA که برای همه زمینهها قابل اعمال هستند. <key> نام پارامتر و <value> مقدار پارامتر است.
- --mca <key> <value>:
ارسال
آرگومانها
به
ماژولهای
مختلف MCA.
برای
جزئیات
بیشتر به
بخش تنظیم
پارامترهای
MCA مراجعه
کنید.
NOTE:
- --pmixmca <key> <value>: ارسال آرگومانها به ماژولهای MCA در زیرسیستم PMIx. برای جزئیات بیشتر به بخش تنظیم پارامترهای MCA مراجعه کنید.
- --prtemca <key> <value>: ارسال آرگومانها به ماژولهای MCA در زیرسیستم محیط زمان اجرای مرجع PMIx (یا PRRTE). برای جزئیات بیشتر به بخش تنظیم پارامترهای MCA مراجعه کنید.
- --tune <tune_file>: تعیین یک فایل تنظیم (tune file) برای تنظیم آرگومانهای ماژولهای مختلف MCA و متغیرهای محیطی. به بخش «تنظیم پارامترهای MCA و متغیرهای محیطی از طریق فایل» مراجعه کنید. --am <arg> نام مستعاری برای --tune <arg> است.
برای اشکالزدایی (Debugging):
- --get-stack-traces: هنگامی که با گزینه --timeout همراه شود، mpirun رد پشته (Stack traces) را از تمام فرآیندهای راهاندازیشده که هنگام اتمام زمانبندی هنوز زنده هستند دریافت و چاپ میکند. توجه داشته باشید که دریافت رد پشته ممکن است زمانبر بوده و خروجی زیادی تولید کند، به ویژه برای کارهایی با تعداد فرآیندهای بالا.
- --timeout <seconds>: حداکثر تعداد ثانیههایی که mpirun اجرا خواهد شد. پس از این مدت زمان، mpirun کار راهاندازیشده را لغو کرده و با وضعیت خروج غیرصفر خارج میشود. استفاده از --timeout در ترکیب با گزینه --get-stack-traces نیز میتواند مفید باشد.
گزینههای دیگری نیز وجود دارند:
- --allow-run-as-root: اجازه اجرای mpirun هنگام اجرا توسط کاربر ریشه (mpirun به طور پیشفرض هنگام اجرا توسط کاربر ریشه لغو میشود). حتماً برای جزئیات بیشتر بخش اجرا به عنوان ریشه را ببینید.
- --app <appfile>: ارائه یک appfile، با نادیده گرفتن تمام گزینههای دیگر خط فرمان.
- --continuous: کار تا زمانی که به طور صریح متوقف نشود، ادامه یابد.
- --disable-recovery: غیرفعال کردن بازیابی (تمام گزینههای بازیابی را به حالت خاموش بازنشانی میکند).
- --do-not-launch: انجام تمام عملیات لازم برای آمادهسازی راهاندازی برنامه، اما عدم راهاندازی واقعی آن.
- --enable-recovery: فعال کردن بازیابی از خرابی فرآیند (پیشفرض: غیرفعال).
- --leave-session-attached: عدم جداسازی دیمنهای پسزمینه مورد استفاده این برنامه. این کار اجازه میدهد پیامهای خطای دیمنها و محیط زیرین (مثلاً در صورت عدم موفقیت در راهاندازی یک دیمن) چاپ شوند.
- --max-restarts <num>: حداکثر تعداد دفعات راهاندازی مجدد یک فرآیند ناموفق.
- --personality <list>: فهرست جداشده با کاما از مدل برنامهنویسی، زبانها و کانتینرهای مورد استفاده [پیشفرض=``ompi``].
- --ppr <list>: فهرست جداشده با کاما از تعداد فرآیندها روی یک نوع منبع معین (پیشفرض: هیچ). نام مستعار برای --map-by ppr:N:OBJ.
- --report-child-jobs-separately: بازگرداندن وضعیت خروج تنها برای کار اصلی.
- --report-events <URI>: گزارش رویدادها به ابزاری که در URI مشخصشده گوش میدهد.
- --report-pid <channel>: چاپ شناسه فرآیند (PID) دستور mpirun هنگام راهاندازی. کانال باید - برای خروجی PID به stdout، + برای خروجی PID به stderr، یا نام فایلی باشد که PID باید در آن نوشته شود.
- --report-uri <channel>: چاپ URI دستور mpirun هنگام راهاندازی. کانال باید - برای خروجی URI به stdout، + برای خروجی URI به stderr، یا نام فایلی باشد که URI باید در آن نوشته شود.
- --show-progress: خروجی یک گزارش دورهای کوتاه از پیشرفت راهاندازی.
- --terminate: پایان دادن به DVM.
- --use-hwthread-cpus:
استفاده از
ریسههای
سختافزاری
به عنوان
CPUهای مستقل.
توجه داشته باشید که اگر تعداد اسلاتها به Open MPI ارائه نشود (مثلاً از طریق کلمه کلیدی slots در یک فایل میزبان یا از طریق یک مدیر منابع مانند Slurm)، استفاده از این گزینه محاسبه پیشفرض تعداد اسلاتها در یک گره را تغییر میدهد. برای جزئیات بیشتر به بخش تعریف اسلات در PRRTE مراجعه کنید.
همچنین توجه داشته باشید که استفاده از این گزینه تعریف Open MPI از یک «عنصر پردازشی» را از یک هسته پردازنده به یک ریسه سختافزاری تغییر میدهد. برای جزئیات بیشتر به بخش تعریف عنصر پردازشی در PRRTE مراجعه کنید.
گزینههای زیر برای توسعهدهندگان مفید هستند؛ آنها عموماً برای بیشتر کاربران Open MPI کاربردی ندارند:
- --debug-daemons: فعال کردن اشکالزدایی دیمنهای زمان اجرا که توسط این برنامه استفاده میشوند.
- --debug-daemons-file: فعال کردن اشکالزدایی دیمنهای زمان اجرای برنامه و ذخیره خروجی در فایلها.
- --display-devel-map: نمایش جدولی دقیقتر شامل مکان نگاشتشده هر فرآیند پیش از راهاندازی.
- --display-topo: نمایش توپولوژی به عنوان بخشی از نقشه فرآیند درست پیش از راهاندازی.
- --launch-agent: نام فایل اجرایی که باید برای شروع فرآیندها در گرههای راه دور استفاده شود. پیشفرض prted است. این گزینه میتواند برای آزمایش مفاهیم جدید دیمن، یا برای ارسال گزینهها به دیمنها بدون اینکه خود mpirun آنها را ببیند استفاده شود. برای مثال، تعیین یک عامل راهاندازی به صورت prted --prtemca odls_base_verbose 5 به توسعهدهنده امکان میدهد خروجی اشکالزدایی را از prted بدون شلوغی از جانب خود mpirun دریافت کند.
- --report-state-on-timeout: هنگامی که با گزینه خط فرمان --timeout همراه شود، وضعیت زیرسیستم زمان اجرای هر فرآیند را پس از اتمام زمانبندی گزارش میدهد.
ممکن است گزینههای دیگری با دستور mpirun --help فهرست شوند.
متغیرهای محیطی (Environment Variables)
- این محتوای قدیمی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
- •
- MPIEXEC_TIMEOUT: مترادف برای گزینه خط فرمان --timeout.
توضیحات (DESCRIPTION)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
یک بار فراخوانی mpirun، اجرای یک برنامه MPI تحت Open MPI را آغاز میکند. اگر برنامه به صورت تکفرآیند با دادههای چندگانه (SPMD) باشد، برنامه میتواند در خط فرمان mpirun مشخص شود.
اگر برنامه به صورت چنددستوری با دادههای چندگانه (MIMD) و شامل چندین برنامه باشد، مجموعه برنامهها و آرگومانها را میتوان به یکی از دو روش مشخص کرد: آرگومانهای گسترشیافته خط فرمان، و زمینه برنامه (Application Context).
یک زمینه برنامه، مجموعه برنامه MIMD شامل تمامی آرگومانها را در یک فایل جداگانه توصیف میکند. این فایل اساساً شامل چندین خط فرمان mpirun، منهای خود نام دستور است. امکان مشخص کردن گزینههای متفاوت برای نمونههای مختلف یک برنامه، دلیل دیگری برای استفاده از زمینه برنامه است.
آرگومانهای گسترشیافته خط فرمان اجازه توصیف چیدمان برنامه را در خط فرمان با استفاده از دو نقطه (:) برای جداسازی مشخصات برنامهها و آرگومانها فراهم میکنند. برخی گزینهها به صورت سراسری برای تمامی برنامههای مشخصشده تنظیم میشوند (مانند --hostfile)، در حالی که برخی دیگر مخصوص یک برنامه منفرد هستند (مانند -n).
تعیین گرههای میزبان (Specifying Host Nodes)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
گرههای میزبان را میتوان در خط فرمان mpirun با گزینه --host یا در یک فایل میزبان (Hostfile) مشخص کرد.
برای مثال:
shell$ mpirun -H aa,aa,bb ./a.out
دو فرآیند را در گره aa و یکی را در bb راهاندازی میکند.
یا فایل میزبان زیر را در نظر بگیرید:
shell$ cat myhostfile aa slots=2 bb slots=2 cc slots=2
در اینجا، ما هم نامهای میزبان (aa، bb و cc) و هم تعداد اسلاتهای هر یک را فهرست میکنیم.
shell$ mpirun --hostfile myhostfile ./a.out
دو فرآیند را در هر یک از این سه گره راهاندازی میکند.
shell$ mpirun --hostfile myhostfile --host aa ./a.out
دو فرآیند را راهاندازی میکند که هر دو در گره aa خواهند بود.
shell$ mpirun --hostfile myhostfile --host dd ./a.out
هیچ میزبانی را برای اجرا پیدا نمیکند و با خطا متوقف میشود. به این معنی که میزبان مشخصشده dd در فایل میزبان مشخصشده وجود ندارد.
هنگام اجرا تحت مدیران منابع (مانند Slurm، Torque و غیره)، Open MPI هم نام میزبانها و هم تعداد اسلاتها را مستقیماً از مدیر منابع دریافت میکند.
تعیین تعداد فرآیندها (Specifying Number of Processes)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
همانطور که دیدیم، تعداد فرآیندها برای اجرا را میتوان با استفاده از فایل میزبان تنظیم کرد. سازوکارهای دیگری نیز وجود دارند.
تعداد فرآیندهای راهاندازیشده را میتوان به صورت مضربی از تعداد گرهها یا بستههای پردازنده موجود مشخص کرد. برای مثال:
shell$ mpirun -H aa,bb --map-by ppr:2:package ./a.out
فرآیندهای 0-3 را در گره aa و فرآیندهای 4-7 را در گره bb راهاندازی میکند (با فرض اینکه aa و bb هر کدام شامل ۴ اسلات باشند).
shell$ mpirun -H aa,bb --map-by ppr:2:node ./a.out
فرآیندهای 0-1 را در گره aa و فرآیندهای 2-3 را در گره bb راهاندازی میکند.
shell$ mpirun -H aa,bb --map-by ppr:1:node ./a.out
یک فرآیند در هر گره میزبان راهاندازی میکند.
mpirun -H aa,bb --pernode ./a.out
مشابه با --map-by ppr:1:node و --npernode 1 است.
راهکار دیگر تعیین تعداد فرآیندها با گزینه -n است. اکنون این فایل میزبان را در نظر بگیرید:
shell$ cat myhostfile aa slots=4 bb slots=4 cc slots=4
اکنون اجرا با myhostfile:
shell$ mpirun --hostfile myhostfile -n 6 ./a.out
فرآیندهای 0-3 را در گره aa و فرآیندهای 4-5 را در گره bb راهاندازی میکند. اسلاتهای باقیمانده در فایل میزبان استفاده نخواهند شد زیرا گزینه -n نشان داده است که تنها ۶ فرآیند باید راهاندازی شوند.
نگاشت فرآیندها به گرهها: استفاده از سیاستها (Mapping Processes to Nodes: Using Policies)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
مثالهای بالا نگاشت پیشفرض فرآیندها به گرهها را نشان میدهند. این نگاشت را میتوان با گزینههای مختلف mpirun که سیاستهای نگاشت را توصیف میکنند نیز کنترل کرد.
همان فایل میزبان بالا را دوباره با -n 6 در نظر بگیرید. جدول زیر چند حالت مختلف mpirun را فهرست کرده و نشان میدهد کدام رتبههای MPI_COMM_WORLD در کدام گره قرار میگیرند:
| Command | Node aa | Node bb | Node cc |
| mpirun | 0 1 2 3 | 4 5 | |
| mpirun --map-by node | 0 3 | 1 4 | 2 5 |
| mpirun --nolocal | 0 1 2 3 | 4 5 |
گزینه --map-by node بار فرآیندها را در سراسر گرههای موجود متعادل میکند و هر فرآیند را به شیوه نوبتگردشی شمارهگذاری مینماید.
گزینه --nolocal از نگاشت هر فرآیندی روی میزبان محلی (در این مورد گره aa) جلوگیری میکند. اگرچه mpirun معمولاً منابع سیستمی کمی مصرف میکند، --nolocal میتواند برای راهاندازی کارهای بسیار بزرگ که در آنها mpirun ممکن است واقعاً نیاز به استفاده از مقادیر قابل توجهی حافظه و/یا زمان پردازش داشته باشد، مفید باشد.
همانطور که -n میتواند فرآیندهایی کمتر از تعداد اسلاتها را مشخص کند، میتواند اسلاتها را دچار اشتراک بیش از حد (Oversubscribe) نیز بکند. برای مثال با همان فایل میزبان:
shell$ mpirun --hostfile myhostfile -n 14 ./a.out
فرآیندهای 0-3 را در گره aa، فرآیندهای 4-7 را در bb و 8-11 را در cc راهاندازی میکند. سپس دو فرآیند باقیمانده را به هر گرهای که انتخاب کند اضافه مینماید.
همچنین میتوان محدودیتهایی را برای اشتراک بیش از حد تعیین کرد. برای مثال با همان فایل میزبان:
shell$ mpirun --hostfile myhostfile -n 14 --nooversubscribe ./a.out
خطا تولید خواهد کرد زیرا --nooversubscribe از اشتراک بیش از حد جلوگیری میکند.
محدودیتهای اشتراک بیش از حد را میتوان در خود فایل میزبان نیز مشخص کرد:
shell$ cat myhostfile aa slots=4 max_slots=4 bb max_slots=4 cc slots=4
فیلد max_slots چنین محدودیتی را تعیین میکند. هنگامی که این کار را انجام میدهد، مقدار slots به طور پیشفرض برابر با این محدودیت میشود. اکنون:
shell$ mpirun --hostfile myhostfile -n 14 ./a.out
باعث میشود ۱۲ فرآیند اول مانند قبل راهاندازی شوند، اما دو فرآیند باقیمانده به اجبار در گره cc قرار گیرند. دو گره دیگر توسط فایل میزبان در برابر اشتراک بیش از حد توسط این کار محافظت میشوند.
استفاده از گزینه --nooversubscribe میتواند مفید باشد زیرا Open MPI در حال حاضر مقادیر max_slots را از مدیر منابع دریافت نمیکند.
البته، -n را میتوان با گزینه -H یا -host نیز استفاده کرد. برای مثال:
shell$ mpirun -H aa,bb -n 8 ./a.out
۸ فرآیند را راهاندازی میکند. از آنجا که تنها دو میزبان مشخص شدهاند، پس از نگاشت دو فرآیند اول (یکی به aa و یکی به bb)، فرآیندهای باقیمانده میزبانهای مشخصشده را دچار اشتراک بیش از حد میکنند.
و این یک مثال MIMD است:
shell$ mpirun -H aa -n 1 hostname : -H bb,cc -n 2 uptime
فرآیند 0 را که hostname را اجرا میکند در گره aa و فرآیندهای 1 و 2 را که هر کدام uptime را اجرا میکنند به ترتیب در گرههای bb و cc راهاندازی میکند.
نگاشت، رتبهبندی و مقیدسازی (Mapping, Ranking, and Binding: Oh My!)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
برنامه Open MPI یک فرآیند سه مرحلهای را برای تخصیص مکانها و رتبههای فرآیند به کار میگیرد:
- 1.
- نگاشت (Mapping): تخصیص یک مکان پیشفرض به هر فرآیند
- 2.
- رتبهبندی (Ranking): تخصیص یک مقدار رتبه MPI_COMM_WORLD به هر فرآیند
- 3.
- مقیدسازی (Binding): محدود کردن هر فرآیند برای اجرا روی پردازندههای خاص
مرحله نگاشت برای تخصیص یک مکان پیشفرض به هر فرآیند بر اساس نگاشتکننده (Mapper) مورد استفاده به کار میرود. نگاشت بر اساس اسلات، گره و به صورت متوالی منجر به تخصیص فرآیندها در سطح گره میشود. در مقابل، نگاشت بر اساس شیء به نگاشتکننده امکان میدهد فرآیند را به یک شیء واقعی در هر گره تخصیص دهد.
توجه داشته باشید که مکان اختصاصیافته به فرآیند مستقل از جایی است که به آن مقید خواهد شد — این تخصیص صرفاً به عنوان ورودی برای الگوریتم مقیدسازی استفاده میشود.
نگاشت فرآیندها به گرهها نه تنها با سیاستهای کلی، بلکه در صورت لزوم با استفاده از نگاشتهای دلخواهی که نمیتوان آنها را با یک سیاست ساده توصیف کرد نیز قابل تعریف است. میتوان از «نگاشتکننده متوالی» استفاده کرد که فایل میزبان را خط به خط خوانده و فرآیندها را به هر ترتیبی که فایل میزبان مشخص میکند به گرهها تخصیص میدهد. از گزینه --map-by seq استفاده کنید. برای مثال، با استفاده از همان فایل میزبان قبلی:
shell$ mpirun -hostfile myhostfile --map-by seq ./a.out
سه فرآیند راهاندازی میکند، یکی در هر یک از گرههای aa، bb و cc به ترتیب. تعداد اسلاتها اهمیتی ندارد؛ در هر خط روی هر گرهای که در آن خط فهرست شده باشد، یک فرآیند راهاندازی میشود.
روش دیگر برای تعیین نگاشتهای دلخواه، استفاده از یک فایل رتبهبندی (Rankfile) است که به شما کنترل دقیقی روی مقیدسازی فرآیند نیز میدهد. فایلهای رتبهبندی در ادامه بررسی شدهاند.
مرحله دوم بر رتبهبندی فرآیند در MPI_COMM_WORLD کار متمرکز است. Open MPI این مرحله را از فرآیند نگاشت جدا میکند تا انعطافپذیری بیشتری در جایگذاری نسبی فرآیندهای MPI فراهم سازد. این موضوع به بهترین وجه با در نظر گرفتن موارد زیر که در آنها از گزینه --np 8 --map-by ppr:2:package --host aa:4,bb:4 استفاده شده است، نشان داده میشود:
| گزینه (Option) | Node aa | Node bb |
| --rank-by fill (بستهبندی متراکم - پیشفرض) | 0 1 | 2 3 | 4 5 | 6 7 |
| --rank-by span (توزیع بار یا پراکنده) | 0 4 | 1 5 | 2 6 | 3 7 |
| --rank-by node | 0 2 | 4 6 | 1 3 | 5 7 |
رتبهبندی بر اساس fill رتبههای MCW را در یک پیشروی ساده در سراسر هر گره تخصیص میدهد. رتبهبندی با span و با slot نتیجه یکسانی ارائه میدهند — یک پیشروی نوبتگردشی بستهها در تمام گرهها قبل از بازگشت به اولین بسته در گره اول. رتبهبندی بر اساس node رتبههای MCW را ابتدا با تکرار در گرهها و سپس بر اساس بسته اختصاص میدهد.
مرحله مقیدسازی عملاً هر فرآیند را به مجموعه معینی از پردازندهها مقید میکند. این کار میتواند کارایی را در صورتی که سیستمعامل فرآیندها را به صورت غیربهینه جایگذاری میکند بهبود بخشد. برای مثال، ممکن است برخی از بستههای پردازنده چندهستهای را دچار اشتراک بیش از حد کند، در حالی که بستههای دیگر را بیکار رها میسازد؛ این میتواند منجر به رقابت غیرضروری فرآیندها بر سر منابع مشترک شود. یا ممکن است فرآیندها را بیش از حد پراکنده کند؛ این حالت در صورتی که کارایی برنامه به هزینههای ارتباط بین فرآیندی حساس باشد، میتواند غیربهینه باشد. مقیدسازی همچنین میتواند مانع از مهاجرت بیش از حد فرآیندها توسط سیستمعامل شود، صرفنظر از اینکه آن فرآیندها در ابتدا چقدر بهینه جایگذاری شده بودند.
پردازندههایی که باید برای مقیدسازی استفاده شوند را میتوان از نظر گروهبندیهای توپولوژیکی شناسایی کرد — به عنوان مثال، مقیدسازی به یک l3cache هر فرآیند را به تمامی پردازندههای درون محدوده یک کش L3 در مکان تخصیصیافته به آنها مقید میکند. بنابراین، اگر فرآیندی توسط نگاشتکننده به یک بسته پردازنده معین تخصیص یابد، دستورالعمل --bind-to l3cache باعث میشود فرآیند به پردازندههایی که یک کش L3 مشترک در آن بسته دارند، مقید شود.
از طرف دیگر، فرآیندها را میتوان با استفاده از گزینه --map-by pe-list= به هستههای مشخصشده نگاشت و مقید کرد. برای مثال، --map-by pe-list=0,2,5 سه فرآیند را نگاشت میکند که هر سه به هستههای منطقی 0,2,5 مقید خواهند شد. اگر قصد دارید هر یک از سه فرآیند را به هستههای متفاوتی مقید کنید، میتوان از اصلاحکننده :ordered مانند --map-by pe-list=0,2,5:ordered استفاده کرد. در این مثال، اولین فرآیند در یک گره به CPU 0، فرآیند دوم در آن گره به CPU 2 و فرآیند سوم در آن گره به CPU 5 مقید خواهد شد.
در نهایت، --report-bindings میتواند برای گزارش مقیدسازیها استفاده شود.
به عنوان مثال، یک گره با دو بسته پردازنده را در نظر بگیرید که هر کدام شامل چهار هسته هستند و هر یک از آن هستهها شامل یک ریسه سختافزاری است. گزینه --report-bindings مقیدسازی هر فرآیند را به روشی توصیفی نشان میدهد. در زیر چند مثال آورده شده است.
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]
در حالت بالا، فرآیندها به هستههای متوالی مقید میشوند.
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]
در حالت بالا، فرآیندها به تمام هستهها در بستههای متوالی مقید میشوند. فرآیندها به تعداد دفعات مورد نیاز به صورت نوبتگردشی در بستههای پردازنده میچرخند. به طور پیشفرض، فرآیندها به شیوه fill رتبهبندی میشوند.
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]
حالت بالا تفاوت در رتبهبندی را زمانی که از اصلاحکننده span به جای پیشفرض استفاده میشود نشان میدهد.
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]
در حالت بالا، خروجی به ما نشان میدهد که ۲ هسته به ازای هر فرآیند مقید شدهاند. به طور مشخص، نگاشت بر اساس slot با اصلاحکننده PE=2 نشان داد که هر اسلات (یعنی فرآیند) باید دو عنصر پردازشی مصرف کند. به طور پیشفرض، Open MPI «عنصر پردازشی» را به عنوان «هسته» تعریف میکند و بنابراین --bind-to core باعث شد هر فرآیند به هر دو هستهای که به آن نگاشت شده بود، مقید شود.
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]
در حالت بالا، --bind-to core را با --use-hwthread-cpus جایگزین میکنیم. گزینه --use-hwthread-cpus به --bind-to hwthread تبدیل میشود و به خروجی --report-bindings اعلام میکند که ریسههای سختافزاری مقیدشده به یک فرآیند را نشان دهد. در این حالت، فرآیندها به ازای هر فرآیند به ۲ ریسه سختافزاری مقید میشوند.
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)
در حالت بالا، مقیدسازی خاموش است و به همین صورت گزارش میشود.
پشتیبانی Open MPI از مقیدسازی فرآیند به سیستمعامل زیرین بستگی دارد. بنابراین، برخی از گزینههای مقیدسازی فرآیند ممکن است در هر سیستمی در دسترس نباشند.
مقیدسازی فرآیند را میتوان با پارامترهای MCA نیز تنظیم کرد. استفاده از آنها نسبت به گزینههای mpirun کمتر راحت است. از سوی دیگر، پارامترهای MCA نه تنها در خط فرمان mpirun، بلکه در فایل mca-params.conf سیستم یا کاربر یا به عنوان متغیرهای محیطی، همانطور که در بخش تنظیم پارامترهای MCA توصیف شده است، قابل تنظیم هستند. اینها پارامترهای MCA برای زمان اجرای PRRTE هستند، بنابراین آرگومان خط فرمان --prtemca (بله، prte با یک r، نه دو r) باید برای ارسال جفت کلید/مقدار پارامتر MCA استفاده شود. متناوباً، جفت کلید/مقدار پارامتر MCA ممکن است در خط فرمان با پیشوند قرار دادن PRTE_MCA_ برای کلید مشخص شود (باز هم، این یک غلط املایی نیست: PRTE است نه PRRTE). برخی از مثالها عبارتند از:
| Option | PRRTE MCA parameter key | Value |
| --map-by core | rmaps_default_mapping_policy | core |
| --map-by package | rmaps_default_mapping_policy | package |
| --rank-by fill | rmaps_default_ranking_policy | fill |
| --bind-to core | hwloc_default_binding_policy | core |
| --bind-to package | hwloc_default_binding_policy | package |
| --bind-to none | hwloc_default_binding_policy | none |
پیشفرضها برای نگاشت، رتبهبندی و مقیدسازی (Defaults for Mapping, Ranking, and Binding)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
اگر کاربر هر یک از گزینههای --map-by، --rank-by و --bind-to را مشخص نکند، مقادیر پیشفرض به شرح زیر خواهند بود:
- •
- اگر هیچ گزینهای مشخص نشده باشد:
- •
- اگر تعداد فرآیندها کمتر یا مساوی ۲ باشد، آنگاه:
- --map-by برابر است با core
- --bind-to برابر است با core
- --rank-by برابر است با span
- نتیجه: --map-by core --bind-to core --rank-by span
- •
- در غیر این صورت:
- --map-by برابر است با package
- --bind-to برابر است با package
- --rank-by برابر است با fill
- نتیجه: --map-by package --bind-to package --rank-by fill
- •
- اگر تنها --map-by OBJ (که در آن OBJ چیزی مانند core است) مشخص شود، آنگاه:
- --map-by مقدار OBJ مشخصشده
- --bind-to از همان OBJ مانند --map-by استفاده میکند
- --rank-by به طور پیشفرض fill است
- نتیجه: --map-by OBJ --bind-to OBJ --rank-by fill
- •
- اگر تنها --bind-to OBJ (که در آن OBJ چیزی مانند core است) مشخص شود، آنگاه:
- --map-by بسته به تعداد فرآیندها core یا package است
- --bind-to مقدار OBJ مشخصشده
- --rank-by به طور پیشفرض fill است
- نتیجه: --map-by OBJ --bind-to OBJ --rank-by fill
- •
- اگر --map-by OBJ1 --bind-to OBJ2 باشد، آنگاه:
- --map-by مقدار OBJ1 مشخصشده
- --bind-to مقدار OBJ2 مشخصشده
- --rank-by به طور پیشفرض fill است
- نتیجه: --map-by OBJ2 --bind-to OBJ2 --rank-by fill
دو میزبان یکسان (hostA و hostB) با ۲ بسته پردازنده (با علامت []) را در نظر بگیرید که هر کدام ۸ هسته (با علامت /../) و ۲ ریسه سختافزاری در هر هسته (با علامت .) دارند.
پیشفرض --map-by core --bind-to core --rank-by span زمانی که تعداد فرآیندها کمتر یا مساوی ۲ است:
shell$ mpirun --np 2 --host hostA:4,hostB:2 ./a.out R0 hostA [BB/../../../../../../..][../../../../../../../..] R1 hostA [../BB/../../../../../..][../../../../../../../..]
پیشفرض --map-by package --bind-to package --rank-by fill زمانی که تعداد فرآیندها بیشتر از ۲ است:
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]
اگر فقط --map-by OBJ مشخص شود، دلالت بر --bind-to OBJ --rank-by fill دارد. مثال زیر منجر به --map-by hwthread --bind-to hwthread --rank-by fill میشود:
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/../../../../../..][../../../../../../../..]
اگر فقط --bind-to OBJ مشخص شود، --map-by بر اساس تعداد فرآیندها تعیین میشود و --rank-by fill اعمال میگردد. مثال زیر منجر به --map-by package --bind-to core --rank-by fill میشود:
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/../../../../../..]
الگوی نگاشت ممکن است بهتر دیده شود اگر --rank-by پیشفرض را از fill به span تغییر دهیم. ابتدا، فرآیندها بر اساس بسته نگاشت میشوند و بین این دو با علامتگذاری یک هسته در هر بار چرخش میکنند. سپس، فرآیندها به روش گسترده (span) که بار آنها را روی شیء نگاشتشده متعادل میکند، رتبهبندی میشوند. در نهایت، فرآیندها به هستهای که به آن نگاشت شده بودند مقید میشوند:
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/../../../../../..]
فایلهای رتبه (Rankfiles)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
فایلهای رتبهبندی (Rankfiles) فایلهای متنی هستند که اطلاعات دقیقی در مورد نحوه نگاشت فرآیندهای منفرد به گرهها و اینکه باید به کدام پردازنده(ها) مقید شوند، مشخص میکنند. هر خط از یک فایل رتبهبندی، مکان یک فرآیند را مشخص میکند (برای کارهای MPI، «رتبه» فرآیند به رتبه آن در MPI_COMM_WORLD اشاره دارد). شکل کلی هر خط در فایل رتبهبندی به صورت زیر است:
rank <N>=<hostname> slot=<slot list>
برای مثال:
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
به این معناست که:
- رتبه 0 در گره aa اجرا میشود، مقید به بسته منطقی 1، هستههای 0-2.
- رتبه 1 در گره bb اجرا میشود، مقید به بسته منطقی 0، هستههای 0 و 1.
- رتبه 2 در گره cc اجرا میشود، مقید به هستههای منطقی 2 و 3.
توجه داشته باشید که تنها مکانهای منطقی پردازنده پشتیبانی میشوند. به طور پیشفرض، مقادیر مشخصشده هسته فرض میشوند. اگر قصد دارید ریسههای سختافزاری خاصی را مشخص کنید، باید اصلاحکننده :hwtcpus را به گزینه خط فرمان --map-by اضافه کنید (مثلاً --map-by rankfile:file=myrankfile:hwtcpus).
اگر مشخصات مقیدسازی بین هر دو رتبه همپوشانی داشته باشد، خطایی رخ میدهد. اگر قصد دارید به فرآیندها اجازه دهید یک واحد پردازشی منطقی یکسان را به اشتراک بگذارند، باید گزینه خط فرمان --bind-to :overload-allowed را ارسال کنید تا به سیستم زمان اجرا اعلام کند این بررسی را نادیده بگیرد.
نامهای میزبان فهرستشده در بالا «مطلق» هستند، به این معنی که نامهای میزبان واقعی و قابل حل مشخص شدهاند. با این حال، نامهای میزبان را میتوان به صورت «نسبی» نیز مشخص کرد، یعنی نسبت به یک فهرست از نامهای میزبان مشخصشده از خارج (مانند آرگومان --host در mpirun، یک فایل میزبان یا زمانبند کار).
مشخصات «نسبی» به صورت +n<X> است که در آن X یک عدد صحیح است که Xامین نام میزبان را در مجموعه تمام نامهای میزبان موجود مشخص میکند که از 0 شمارهگذاری شده است. برای مثال:
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
تمام مکانهای اسلات بسته/هسته به صورت شاخصهای منطقی مشخص میشوند.
NOTE:
میتوانید از ابزارهایی مانند lstopo(1) در Hwloc برای یافتن شاخصهای منطقی بسته و هستهها استفاده کنید.
زمینه برنامه یا برنامه اجرایی؟ (Application Context or Executable Program?)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
برای تمایز بین این دو شکل مختلف، mpirun در خط فرمان به دنبال گزینه --app میگردد. در صورت مشخص شدن آن، فرض میشود فایلی که در خط فرمان نامگذاری شده است، یک زمینه برنامه (Application Context) است. اگر مشخص نشده باشد، فرض میشود فایل یک برنامه اجرایی است.
یافتن فایلها (Locating Files)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
اگر هیچ مسیر نسبی یا مطلقی برای یک فایل مشخص نشده باشد، Open MPI ابتدا با جستجو در دایرکتوریهای مشخصشده توسط گزینه --path به دنبال فایلها میگردد. اگر گزینه --path تنظیم نشده باشد یا اگر فایل در مکان --path پیدا نشود، آنگاه Open MPI متغیر محیطی PATH کاربر را همانطور که در گره(های) مبدأ تعریف شده است جستجو میکند.
اگر یک دایرکتوری نسبی مشخص شده باشد، باید نسبت به دایرکتوری کاری اولیه که توسط آغازگر خاص مورد استفاده تعیین شده است، نسبی باشد. به عنوان مثال هنگام استفاده از آغازگر ssh، دایرکتوری اولیه به طور پیشفرض $HOME است. سایر آغازگرها ممکن است دایرکتوری اولیه را روی دایرکتوری کاری جاری ناشی از فراخوانی mpirun تنظیم کنند.
دایرکتوری کاری جاری (Current Working Directory)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
گزینه --wdir در mpirun (و مترادف آن، --wd) به کاربر امکان میدهد پیش از فراخوانی برنامه، به یک دایرکتوری دلخواه تغییر مسیر دهد. همچنین میتوان از آن در فایلهای زمینه برنامه برای تعیین دایرکتوریهای کاری در گرههای خاص و/یا برای برنامههای خاص استفاده کرد.
اگر گزینه --wdir هم در یک فایل زمینه و هم در خط فرمان ظاهر شود، دایرکتوری فایل زمینه بر مقدار خط فرمان اولویت خواهد داشت.
اگر گزینه -wdir مشخص شده باشد، Open MPI تلاش میکند در تمامی گرههای راه دور به دایرکتوری مشخصشده تغییر مسیر دهد. در صورت عدم موفقیت، mpirun متوقف میشود.
اگر گزینه -wdir مشخص نشده باشد، Open MPI نام دایرکتوری محل فراخوانی mpirun را به هر یک از گرههای راه دور ارسال میکند. گرههای راه دور تلاش میکنند به آن دایرکتوری تغییر مسیر دهند. اگر نتوانند (مثلاً اگر دایرکتوری در آن گره وجود نداشته باشد)، Open MPI از دایرکتوری پیشفرض تعیینشده توسط آغازگر استفاده خواهد کرد.
تمام تغییر دایرکتوریها پیش از فراخوانی برنامه کاربر رخ میدهد؛ این فرآیند تا زمان فراخوانی MPI_INIT(3) منتظر نمیماند.
ورودی/خروجی استاندارد (Standard I/O)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
برنامه Open MPI ورودی استاندارد یونیکس (stdin) را در تمام فرآیندها به جز فرآیند با رتبه 0 در MPI_COMM_WORLD به /dev/null هدایت میکند. فرآیند رتبه 0 در MPI_COMM_WORLD ورودی استاندارد را از mpirun به ارث میبرد.
NOTE:
برنامه Open MPI خروجی و خطای استاندارد یونیکس (stdout و stderr) را از گرههای راه دور به گرهای که mpirun را فراخوانی کرده هدایت کرده و آن را در خروجی/خطای استاندارد mpirun چاپ میکند. فرآیندهای محلی خروجی/خطای استاندارد mpirun را به ارث برده و مستقیماً به آن انتقال میدهند.
بنابراین میتوان ورودی/خروجی استاندارد را برای برنامههای Open MPI با استفاده از رویه متداول تغییر مسیر شل روی mpirun تغییر مسیر داد. برای مثال:
shell$ mpirun -n 2 my_app < my_input > my_output
توجه داشته باشید که در این مثال تنها فرآیند رتبه 0 در MPI_COMM_WORLD جریان را از my_input در stdin دریافت خواهد کرد. stdin در تمام گرههای دیگر به /dev/null متصل خواهد شد. با این حال، stdout از تمام گرهها در فایل my_output جمعآوری خواهد شد.
انتشار سیگنال (Signal Propagation)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
هنگامی که mpirun سیگنالهای SIGTERM و SIGINT را دریافت میکند، تلاش میکند تا کل کار را با ارسال یک SIGTERM به تمام فرآیندهای موجود در کار، انتظار برای چند ثانیه کوتاه، و سپس ارسال یک SIGKILL به تمام فرآیندهای کار متوقف کند.
سیگنالهای SIGUSR1 و SIGUSR2 دریافتشده توسط mpirun به تمامی فرآیندهای موجود در کار منتشر میشوند.
یک سیگنال SIGTSTP به mpirun باعث ارسال سیگنال SIGSTOP به تمامی برنامههای راهاندازیشده توسط mpirun میشود و به همین ترتیب سیگنال SIGCONT به mpirun باعث ارسال SIGCONT خواهد شد.
سیگنالهای دیگر در حال حاضر توسط mpirun منتشر نمیشوند.
خاتمه فرآیند / رسیدگی به سیگنال (Process Termination / Signal Handling)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
در طول اجرای یک برنامه MPI، اگر هر فرآیندی به طور غیرعادی متوقف شود (یا پیش از فراخوانی MPI_FINALIZE(3) خارج شود، یا در نتیجه یک سیگنال بمیرد)، mpirun یک پیام خطا چاپ کرده و بقیه برنامه MPI را متوقف میکند.
گردانندههای سیگنال کاربر (Signal handlers) احتمالاً باید از تلاش برای پاکسازی وضعیت MPI خودداری کنند (Open MPI در حال حاضر از نظر سیگنالهای ناهمگام ایمن نیست (async-signal-safe)؛ برای جزئیات درباره MPI_THREAD_MULTIPLE و ایمنی ریسه به MPI_INIT_THREAD(3) مراجعه کنید). برای مثال، اگر یک خطای دسترسی به حافظه (Segmentation fault) در MPI_SEND(3) رخ دهد (احتمالاً به دلیل ارسال یک بافر نامعتبر) و یک گرداننده سیگنال کاربر فراخوانی شود، اگر این گرداننده کاربر تلاش کند MPI_FINALIZE(3) را فراخوانی کند، ممکن است اتفاقات ناگواری رخ دهد زیرا Open MPI هنگام بروز خطا از قبل «درون» MPI بوده است. از آنجا که mpirun متوجه خواهد شد فرآیند به دلیل یک سیگنال متوقف شده است، احتمالاً برای کاربر نیازی نیست (و امنترین حالت است) که فقط وضعیتهای غیر MPI را پاکسازی کند.
محیط فرآیند (Process Environment)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
فرآیندها در برنامه MPI محیط خود را از دیمن PRRTE موجود در گرهای که روی آن در حال اجرا هستند به ارث میبرند. محیط معمولاً از شل کاربر به ارث برده میشود. در گرههای راه دور، محیط دقیق توسط ماژول MCA راهانداز (Boot) مورد استفاده تعیین میشود. ماژول راهاندازی rsh، برای مثال، از rsh/ssh برای راهاندازی دیمن PRRTE در گرههای راه دور استفاده میکند و معمولاً پیش از راهاندازی دیمن PRRTE، یک یا چند فایل راهاندازی شل کاربر را اجرا مینماید. هنگام اجرای برنامههای پیوندیافته پویا (Dynamically linked) که نیازمند تنظیم متغیر محیطی LD_LIBRARY_PATH هستند، باید دقت شود تا اطمینان حاصل شود که این متغیر هنگام بوت Open MPI به درستی تنظیم شده باشد.
برای جزئیات بیشتر بخش اجرای از راه دور را ببینید.
اجرای از راه دور (Remote Execution)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
برنامه Open MPI نیاز دارد که متغیر محیطی PATH برای یافتن فایلهای اجرایی در گرههای راه دور تنظیم شده باشد (این موضوع معمولاً فقط در محیطهای مبتنی بر rsh یا ssh ضروری است — محیطهای دستهای/زمانبندیشده معمولاً محیط فعلی را برای اجرای کارهای راه دور کپی میکنند، بنابراین اگر محیط فعلی PATH و/یا LD_LIBRARY_PATH را به درستی تنظیم کرده باشد، گرههای راه دور نیز آن را به درستی تنظیم خواهند داشت). اگر Open MPI با پشتیبانی از کتابخانههای اشتراکی کامپایل شده باشد، ممکن است لازم باشد متغیر محیطی LD_LIBRARY_PATH نیز در گرههای راه دور تنظیم شود (به ویژه برای یافتن کتابخانههای اشتراکی مورد نیاز برای اجرای برنامههای MPI کاربر).
با این حال، همیشه مطلوب یا ممکن نیست که فایلهای راهاندازی شل برای تنظیم PATH و/یا LD_LIBRARY_PATH ویرایش شوند. گزینه --prefix برای برخی از پیکربندیهای ساده که در آنها این کار امکانپذیر نیست فراهم شده است.
گزینه --prefix یک آرگومان منفرد میگیرد: دایرکتوری پایهای در گره راه دور که Open MPI در آن نصب شده است. Open MPI از این دایرکتوری برای تنظیم PATH و LD_LIBRARY_PATH راه دور پیش از اجرای هر برنامه Open MPI یا کاربر استفاده خواهد کرد. این امکان اجرای کارهای Open MPI را بدون نیاز به پیکربندی قبلی PATH و LD_LIBRARY_PATH در گرههای راه دور فراهم میکند.
برنامه Open MPI نام پایه (Basename) دایرکتوری $bindir گره جاری (دایرکتوری محل نصب فایلهای اجرایی Open MPI) را به پیشوند اضافه کرده و از آن برای تنظیم PATH در گره راه دور استفاده میکند. به طور مشابه، Open MPI نام پایه دایرکتوری $libdir گره جاری (دایرکتوری محل نصب کتابخانههای Open MPI) را به پیشوند اضافه کرده و از آن برای تنظیم LD_LIBRARY_PATH در گره راه دور استفاده میکند. برای مثال:
- دایرکتوری bin محلی: /local/node/directory/bin
- دایرکتوری lib محلی: /local/node/directory/lib64
اگر از خط فرمان زیر استفاده شود:
shell$ mpirun --prefix /remote/node/directory
برنامه Open MPI پیش از تلاش برای اجرای هر چیزی، /remote/node/directory/bin را به PATH و /remote/node/directory/lib64 را به LD_LIBRARY_PATH در گره راه دور اضافه خواهد کرد.
گزینه --prefix در صورتی که مسیرهای نصب در گره راه دور با گره محلی متفاوت باشد (برای مثال، اگر در گره محلی از /lib استفاده شود اما در گره راه دور از /lib64 استفاده گردد)، یا اگر مسیرهای نصب چیزی غیر از یک زیردایرکتوری تحت یک پیشوند مشترک باشند، کافی نخواهد بود.
توجه داشته باشید که اجرای mpirun از طریق یک نام مسیر مطلق معادل تعیین --prefix بدون آخرین زیردایرکتوری در مسیر مطلق به mpirun است. برای مثال:
shell$ /usr/local/bin/mpirun ...
معادل است با
shell$ mpirun --prefix /usr/local
متغیرهای محیطی صادرشده (Exported Environment Variables)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
تمامی متغیرهای محیطی که به صورت OMPI_* نامگذاری شدهاند به طور خودکار به فرآیندهای جدید در گرههای محلی و راه دور صادر میشوند. پارامترهای محیطی را میتوان با استفاده از پارامتر MCA با نام mca_base_env_list نیز برای فرآیندهای جدید تنظیم یا فوروارد کرد. گزینه -x برای mpirun منسوخ شده است، اما نحو پارامتر MCA از همان مثال قبلی پیروی میکند. اگرچه نحو گزینه -x و پارامتر MCA تعریف متغیرهای جدید را ممکن میسازد، توجه داشته باشید که تجزیهکننده این گزینهها در حال حاضر چندان پیشرفته نیست — حتی مقادیر نقلقولشده را متوجه نمیشود. به کاربران توصیه میشود متغیرها را در محیط مقداردهی کنند و از این گزینه برای صادر کردن آنها (نه تعریف آنها) استفاده نمایند.
تنظیم پارامترهای MCA (Setting MCA Parameters)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
سوییچ --mca اجازه ارسال پارامترها به ماژولهای مختلف MCA (معماری مؤلفه ماژولار یا Modular Component Architecture) را میدهد. ماژولهای MCA تأثیر مستقیمی بر برنامههای MPI دارند زیرا به پارامترهای قابل تنظیم اجازه میدهند در زمان اجرا تنظیم شوند (مانند اینکه از کدام درایور دستگاه ارتباطی BTL استفاده شود، چه پارامترهایی به آن BTL ارسال شود و غیره).
سوییچ --mca دو آرگومان میگیرد: <key> و <value>. آرگومان <key> عموماً مشخص میکند که کدام ماژول MCA مقدار را دریافت خواهد کرد. به عنوان مثال، <key> با مقدار btl برای انتخاب BTL مورد استفاده در انتقال پیامهای MPI استفاده میشود. آرگومان <value> مقداری است که ارسال میشود. برای مثال:
shell$ mpirun --mca btl tcp,self -n 1 my_mpi_app
این دستور به Open MPI میگوید که از BTLهای tcp و self استفاده کند و یک نسخه تکی از my_mpi_app را در یک گره تخصیصیافته اجرا نماید.
shell$ mpirun --mca btl self -n 1 my_mpi_app
به Open MPI میگوید از BTL با نام self استفاده کند و یک نسخه تکی از my_mpi_app را در یک گره تخصیصیافته اجرا نماید.
سوییچ --mca را میتوان چندین بار برای تعیین آرگومانهای مختلف <key> و/یا <value> استفاده کرد. اگر یک <key> یکسان بیش از یک بار مشخص شود، مقادیر <value> با یک کاما (,``) جداکننده به هم متصل میشوند.
توجه داشته باشید که سوییچ --mca صرفاً یک میانبر برای تنظیم متغیرهای محیطی است. همین اثر را میتوان با تنظیم متغیرهای محیطی متناظر پیش از اجرای mpirun به دست آورد. شکل متغیرهای محیطی که Open MPI تنظیم میکند به این صورت است:
OMPI_MCA_<key>=<value>
بنابراین، سوییچ --mca هرگونه متغیر محیطی از قبل تنظیمشده را لغو و بازنویسی میکند. تنظیمات --mca به طور مشابه پارامترهای MCA تنظیمشده در فایل $OPAL_PREFIX/etc/openmpi-mca-params.conf یا $HOME/.openmpi/mca-params.conf را بازنویسی میکنند.
آرگومانهای ناشناخته <key> همچنان به عنوان متغیر محیطی تنظیم میشوند — صحت آنها (توسط mpirun) بررسی نمیشود. آرگومانهای غیرمجاز یا نادرست <value> ممکن است گزارش شوند یا نشوند — این امر به ماژول خاص MCA بستگی دارد.
برای یافتن انواع مؤلفههای موجود تحت معماری MCA یا یافتن پارامترهای موجود برای یک مؤلفه خاص، از دستور ompi_info استفاده کنید. برای اطلاعات دقیق در مورد این دستور به صفحه راهنمای ompi_info(1) مراجعه فرمایید.
تنظیم پارامترهای MCA و متغیرهای محیطی از طریق فایل (Setting MCA parameters and environment variables from file)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
گزینه خط فرمان --tune و مترادف آن --mca mca_base_envar_file_prefix به کاربر اجازه میدهد پارامترهای MCA و متغیرهای محیطی را با نحو توضیحدادهشده در زیر تنظیم کند. این گزینه نیازمند یک فایل منفرد یا فهرستی از فایلهای جداشده با «,» در ادامه است.
یک خط معتبر در فایل ممکن است شامل صفر یا چند -x یا --mca باشد. الگوهای زیر پشتیبانی میشوند:
- --mca var val
- --mca var "val"
- -x var=val
- -x var
اگر آرگومانی در فایل تکرار شود، آخرین مقدار خواندهشده استفاده خواهد شد.
پارامترهای MCA و متغیرهای محیطی مشخصشده در خط فرمان اولویت بالاتری نسبت به متغیرهای مشخصشده در فایل دارند.
اجرا به عنوان ریشه (Running as root)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
هشدار (WARNING):
دستور mpirun به طور پیشفرض از اجرا به عنوان ریشه خودداری میکند.
برای لغو این پیشفرض، میتوانید گزینه --allow-run-as-root را به خط فرمان mpirun اضافه کنید، یا میتوانید پارامترهای محیطی OMPI_ALLOW_RUN_AS_ROOT=1 و OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 را تنظیم نمایید. توجه داشته باشید که تنظیم دو متغیر محیطی برای اعمال رفتاری مشابه با --allow-run-as-root به منظور تأکید بر توصیه اکید تیم Open MPI مبنی بر عدم اجرا به عنوان کاربر ریشه در نظر گرفته شده است.
پس از بحثهای گسترده با جوامعی که از کانتینرها استفاده میکنند (که در آنها اجرا به عنوان کاربر ریشه پیشفرض است)، تمایل مداومی برای امکان فعال کردن اجرای ریشه در mpirun از طریق کنترل محیطی (در مقایسه با پارامتر خط فرمان موجود --allow-run-as-root) وجود داشت. راهحل میانه استفاده از دو متغیر محیطی اتخاذ شد: این کار امکان اجرای ریشه را از طریق کنترل محیطی فراهم میکند، اما توصیه اکید تیم Open MPI را علیه این رفتار منتقل میسازد.
وضعیت خروج (Exit status)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
هیچ تعریف استانداردی برای آنچه mpirun باید به عنوان وضعیت خروج برگرداند وجود ندارد. پس از بحثهای قابل توجه، ما روش زیر را برای تخصیص وضعیت خروج mpirun تعیین کردیم (نکته: در توضیحات زیر، کار «اصلی» برنامه اولیهای است که توسط mpirun آغاز شده است — تمام کارهایی که توسط آن کار ایجاد میشوند کارهای «فرعی» نامیده میشوند):
- اگر تمام فرآیندها در کار اصلی به طور معمول با وضعیت خروج 0 خاتمه یابند، mpirun مقدار 0 را برمیگرداند.
- اگر یک یا چند فرآیند در کار اصلی به طور معمول با وضعیت خروج غیرصفر خاتمه یابند، mpirun وضعیت خروج فرآیندی با پایینترین رتبه MPI_COMM_WORLD را که وضعیت غیرصفر دارد برمیگرداند.
- اگر تمام فرآیندها در کار اصلی به طور معمول با وضعیت خروج 0 خاتمه یابند، و یک یا چند فرآیند در یک کار فرعی به طور معمول با وضعیت خروج غیرصفر خاتمه یابند، mpirun:
- 1.
- وضعیت خروج فرآیند با پایینترین رتبه MPI_COMM_WORLD در پایینترین jobid که دارای وضعیت غیرصفر است را برمیگرداند، و
- 2.
- پیامی را چاپ میکند که وضعیت خروج کار اصلی و تمام کارهای فرعی را خلاصه مینماید.
- •
- اگر گزینه خط فرمان --report-child-jobs-separately تنظیم شده باشد، ما فقط وضعیت خروج کار اصلی را برمیگردانیم. هرگونه وضعیت خروج غیرصفر در کارهای فرعی صرفاً در یک گزاره چاپی خلاصهشده گزارش خواهد شد.
به طور پیشفرض، زمانی که هر فرآیندی با وضعیت غیرصفر خاتمه یابد، کل کار لغو میشود. پارامتر MCA با نام --prtemca state_base_error_non_zero_exit را میتوان روی «false» (یا «0») تنظیم کرد تا در صورت بازگشت وضعیت غیرصفر توسط یک یا چند فرآیند، باعث لغو کار توسط Open MPI نشود. در این شرایط، Open MPI خروج فرآیندها با وضعیت خاتمه غیرصفر را ثبت کرده و وضعیت خروج مناسب mpirun را (طبق موارد فوق) گزارش میدهد.
مثالها (EXAMPLES)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
حتماً مثالهای موجود در تمامی بخشهای بالا را نیز مشاهده فرمایید.
shell$ mpirun -n 4 --mca btl tcp,sm,self prog1
اجرای ۴ نسخه از prog1 با استفاده از BTLهای tcp، sm (حافظه اشتراکی) و self (لوپبک فرآیند) برای انتقال پیامهای MPI.
مقدار بازگشتی (RETURN VALUE)
- این محتوای قدیمی و کدگذاریشده دستی است
-
آیا این محتوا هنوز بهروز و دقیق است؟ آیا باید بهروزرسانی و حفظ شود یا حذف گردد؟
دستور mpirun در صورتی که تمام فرآیندهای آغازشده توسط mpirun پس از فراخوانی MPI_FINALIZE(3) خارج شوند، مقدار 0 را برمیگرداند. اگر خطای داخلی در mpirun رخ دهد، یا یک یا چند فرآیند قبل از فراخوانی MPI_FINALIZE(3) خارج شوند، یک مقدار غیرصفر بازگردانده میشود. اگر خطای داخلی در mpirun رخ دهد، کد خطای مربوطه بازگردانده میشود. در صورتی که یک یا چند فرآیند قبل از فراخوانی MPI_FINALIZE(3) خارج شوند، مقدار بازگشتی رتبه MPI_COMM_WORLD فرآیندی که mpirun ابتدا متوجه توقف آن قبل از فراخوانی MPI_FINALIZE(3) شده است، بازگردانده خواهد شد. توجه داشته باشید که به طور کلی، این اولین فرآیندی خواهد بود که متوقف شده است اما تضمینی برای آن وجود ندارد.
اگر از گزینه خط فرمان --timeout استفاده شود و مهلت زمانی قبل از اتمام کار منقضی گردد (و در نتیجه mpirun مجبور به لغو کار شود)، mpirun یک وضعیت خروج معادل مقدار ETIMEDOUT (که در سیستمهای لینوکس و OS X معمولاً ۱۱۰ است) برمیگرداند.
همچنین ببینید (SEE ALSO):
حق نشر (COPYRIGHT)
2003-2026, The Open MPI Community
| February 23, 2026 |