SHMEMCC(1) Open MPI SHMEMCC(1)

shmemcc - کامپایلر پوششی OpenSHMEM برای زبان C

oshcc [--showme | --showme:compile | --showme:link] ...

oshcxx [--showme | --showme:compile | --showme:link] ...

oshc++ [--showme | --showme:compile | --showme:link] ...

oshfort [--showme | --showme:compile | --showme:link] ...

shmemcc [--showme | --showme:compile | --showme:link] ...

shmemcxx [--showme | --showme:compile | --showme:link] ...

shmemc++ [--showme | --showme:compile | --showme:link] ...

shmemfort [--showme | --showme:compile | --showme:link] ...

گزینه‌های زیر برای همهٔ کامپایلرهای پوششی اعمال می‌شوند:

•
--showme: این گزینه در چندین شکل مختلف در دسترس است (پایین را ببینید). هیچ‌یک از شکل‌ها کامپایلر زیرین را فراخوانی نمی‌کنند؛ همهٔ آن‌ها اطلاعاتی دربارهٔ چگونگی فراخوانی کامپایلر زیرین در صورتی که از --showme استفاده نمی‌شد ارائه می‌دهند. گزینهٔ پایهٔ --showme خط فرمانی را که برای کامپایل برنامه اجرا می‌شد در خروجی نمایش می‌دهد.

نکته:

اگر آرگومانی غیر از نام فایل در خط فرمان ارسال شود، گزینهٔ --showme هیچ پرچم اضافی را نمایش نخواهد داد. برای نمونه، هر دو دستور "shmemcc --showme و shmemcc --showme my_source.c تمام پرچم‌های ارائه‌شده توسط پوشش را نشان خواهند داد. اما دستور shmemcc --showme -v فقط نام کامپایلر زیرین و -v را نمایش خواهد داد.
  • --showme:compile: پرچم‌های کامپایلری را که به کامپایلر زیرین ارائه می‌شدند در خروجی نمایش می‌دهد.
  • --showme:link: پرچم‌های پیونددهنده‌ای را که به کامپایلر زیرین ارائه می‌شدند در خروجی نمایش می‌دهد.
  • --showme:command: فرمان کامپایلر زیرین را (که ممکن است شامل یک یا چند نشانه باشد) در خروجی نمایش می‌دهد.
  • --showme:incdirs: فهرستی جداشده با فاصله (اما در غیر این صورت ساده و بدون قالب‌بندی اضافی) از پوشه‌هایی که کامپایلر پوششی برای مشخص کردن محل فایل‌های سرایند مربوطه به کامپایلر زیرین ارائه می‌داد را در خروجی نمایش می‌دهد.
  • --showme:libdirs: فهرستی جداشده با فاصله (اما در غیر این صورت ساده و بدون قالب‌بندی اضافی) از پوشه‌هایی که کامپایلر پوششی برای مشخص کردن محل کتابخانه‌های مربوطه به پیونددهندهٔ زیرین ارائه می‌داد را در خروجی نمایش می‌دهد.
  • --showme:libs فهرستی جداشده با فاصله (اما در غیر این صورت ساده و بدون قالب‌بندی اضافی) از نام کتابخانه‌هایی که کامپایلر پوششی برای پیوند دادن یک برنامه به کار می‌برد را در خروجی نمایش می‌دهد. برای نمونه: mpi open-pal util.
  • --showme:version: شمارهٔ نسخهٔ Open MPI را در خروجی نمایش می‌دهد.
  • --showme:help: یک پیام راهنمای خلاصه از نحوهٔ استفاده را در خروجی نمایش می‌دهد.

برای سایر گزینه‌هایی که می‌توانند از طریق shmemcc و oshcc ارسال شوند، به صفحهٔ راهنمای کامپایلر زیرین خود مراجعه کنید.

از نظر مفهومی، نقش این دستورها کاملاً ساده است: افزودن شفاف پرچم‌های مرتبط کامپایلر و پیونددهنده به خط فرمان کاربر که برای کامپایل / پیوند برنامه‌های OpenSHMEM ضروری هستند، و سپس فراخوانی کامپایلر زیرین برای اجرای واقعی فرمان.

به همین دلیل، از این دستورها مکرراً با عنوان کامپایلرهای «پوششی» (wrapper) یاد می‌شود زیرا خود آن‌ها برنامه‌ها را کامپایل یا پیوند نمی‌زنند؛ آن‌ها صرفاً پرچم‌های خط فرمان را افزوده و کامپایلر پشتی (back-end) را فراخوانی می‌کنند.

پروژهٔ Open MPI کامپایلرهای پوششی را برای چندین زبان ارائه می‌دهد:

  • oshcc، shmemcc: زبان C
  • oshc++، oshcxx، shmemc++، shmemcxx: زبان C++
  • oshfort، shmemfort: زبان Fortran

کامپایلرهای پوششی برای هر یک از زبان‌ها یکسان هستند؛ می‌توان از آن‌ها به‌جای یکدیگر استفاده کرد. نام‌های مختلف صرفاً جهت سازگاری رو به عقب ارائه شده‌اند.

کامپایلر پوششی Fortran برای OpenSHMEM (oshfort و shmemfort) می‌تواند برنامه‌های OpenSHMEM را که از هرکدام/همهٔ انقیادهای (bindings) فورترن OpenSHMEM استفاده می‌کنند، کامپایل و پیوند کند.

با این حال، توجه داشته باشید که کامپایلر Fortran ممکن است به گزینه‌های خط فرمان اضافی برای اعمال یک گویش خاص از Fortran نیاز داشته باشد. برای نمونه، در برخی از نسخه‌های کامپایلر IBM XLF، اگر xlf90 کامپایلر زیرین Fortran باشد، ممکن است برای کامپایل فایل‌های منبع Fortran با قالب ثابت (fixed-format)، گزینهٔ -qfixed ضروری باشد.

در نهایت، دقت داشته باشید که اگر پشتیبانی از Fortran در لایهٔ OpenSHMEM ساخته نشده باشد، oshfort غیرفعال خواهد بود و در صورت استفاده خطا بازمی‌گرداند.

دستورهای oshcc و shmemcc پوشش‌های تسهیل‌کننده برای کامپایلر زیرین C هستند. ترجمهٔ یک برنامهٔ OpenSHMEM نیازمند پیوند دادن کتابخانه‌های ویژهٔ OpenSHMEM است که ممکن است در یکی از پوشه‌های استاندارد جستجوی ld(1) قرار نداشته باشند. این امر همچنین اغلب مستلزم گنجاندن فایل‌های سرایندی است که ممکن است در یک مکان استاندارد یافت نشوند.

دستورهای oshcc و shmemcc آرگومان‌های خود را همراه با گزینه‌های -I، -L و -l که برای برنامه‌های OpenSHMEM الزامی هستند، به کامپایلر زیرین C منتقل می‌کنند.

این موضوع برای تمام کامپایلرهای پوششی سایر زبان‌ها نیز صدق می‌کند.

تیم OpenSHMEM اکیداً توصیه می‌کند که به جای تلاش برای پیوند دستی به کتابخانه‌های OpenSHMEM، از کامپایلرهای پوششی استفاده کنید. این رویکرد به پیاده‌سازی خاص OpenSHMEM اجازه می‌دهد تا بدون تحمیل تغییرات به دستورالعمل‌های پیونددهنده در Makefile کاربران تغییر کند. در واقع، مجموعهٔ خاص پرچم‌ها و کتابخانه‌های مورد استفاده توسط کامپایلرهای پوششی به نحوهٔ پیکربندی و ساخت OpenSHMEM بستگی دارد؛ این مقادیر می‌توانند بین نصب‌های مختلف از یک نسخه از OpenSHMEM تغییر کنند.

در واقع، از آنجا که این پوشش‌ها صرفاً پوسته‌های نازکی بر فراز یک کامپایلر زیرین هستند، دلایل قانع‌کنندهٔ بسیار بسیار کمی برای عدم استفاده از shmemcc و oshcc وجود دارد. هنگامی که استفادهٔ مستقیم از پوشش‌ها امکان‌پذیر نیست، باید از گزینه‌های --showme:compile و --showme:link برای تعیین اینکه پوشش‌ها از چه پرچم‌هایی استفاده می‌کردند، بهره گرفت. برای نمونه:

shell$ cc -c file1.c `shmemcc --showme:compile`
shell$ cc -c file2.c `shmemcc --showme:compile`
shell$ cc file1.o file2.o `shmemcc --showme:link` -o my_oshmem_program

امکان دارد که کامپایلرهای پوششی با قابلیت آگاهی از چندکتابخانه‌ای (multi-lib) پیکربندی شوند. بدین معنا که کتابخانه‌ها و فایل‌های سرایند گنجانده‌شده ممکن است بر اساس پرچم‌های تعیین‌شده برای کامپایلر متفاوت باشند (برای نمونه، با کامپایلرهای GNU در لینوکس، در صورت مشاهدهٔ -m32 در مقایسه با مشاهدهٔ -m64 ممکن است مسیر متفاوتی برای کتابخانه‌ها استفاده شود). این رفتار پیش‌فرض در ساخت استاندارد نیست، اما می‌تواند فعال شود (برای نمونه، در یک بستهٔ باینری که پشتیبانی از هر دو حالت ۳۲ و ۶۴ بیتی را ارائه می‌دهد). اطلاعات بیشتر را می‌توانید در مستندات پروژه بیابید.

رشته‌هایی که کامپایلرهای پوششی پیش از فراخوانی کامپایلر زیرین در خط فرمان درج می‌کنند، در یک فایل متنی ذخیره شده‌اند که توسط OpenSHMEM ایجاد و در $pkgdata/NAME-wrapper-data.txt نصب می‌شود، که در آن:

  • $pkgdata معمولاً $prefix/share/openmpi است
  • $prefix دایرکتوری اصلی و سطح بالای نصب OpenSHMEM است
  • NAME نام کامپایلر پوششی است (برای نمونه، $pkgdata/shmemcc-wrapper-data.txt)

به‌ندرت ویرایش این فایل‌ها ضرورت پیدا می‌کند، اما می‌توان آن‌ها را بررسی کرد تا مشخص شود چه پرچم‌هایی توسط پوشش‌ها در خط فرمان قرار داده می‌شوند.

به‌طور پیش‌فرض، پوشش‌ها از کامپایلرهایی استفاده می‌کنند که هنگام پیکربندی OpenSHMEM انتخاب شده بودند. این کامپایلرها یا به‌طور خودکار توسط اسکریپت «configure» مربوط به Open MPI پیدا شده بودند، یا پیش از فراخوانی configure توسط کاربر در متغیرهای محیطی CC، CXX و/یا FC تعیین گردیده بودند. علاوه بر این، آرگومان‌های دیگری مختص کامپایلر ممکن است توسط configure انتخاب شده باشند.

این مقادیر را می‌توان با ویرایش فایل‌های متنی حاوی اطلاعات این پیکربندی (بخش فایل‌ها (FILES) را ببینید) یا با تعیین متغیرهای محیطی انتخابی به صورت oshmem_value، به‌صورت گزینشی بازنویسی کرد.

نام‌های معتبر مقادیر عبارتند از:

  • CPPFLAGS: پرچم‌های افزوده‌شده هنگام فراخوانی پیش‌پردازنده (C یا C++)
  • LDFLAGS: پرچم‌های افزوده‌شده هنگام فراخوانی پیونددهنده (C، C++ یا Fortran)
  • LIBS: کتابخانه‌های افزوده‌شده هنگام فراخوانی پیونددهنده (C، C++ یا Fortran)
  • CC: کامپایلر C
  • CFLAGS: پرچم‌های کامپایلر C
  • CXX: کامپایلر C++
  • CXXFLAGS: پرچم‌های کامپایلر C++
  • FC: کامپایلر Fortran
  • FCFLAGS: پرچم‌های کامپایلر Fortran

2003-2026, The Open MPI Community

February 23, 2026