XLA گزینههایی برای کنترل میزان تلاشی که کامپایلر صرف میکند، ارائه میدهد.
- بهینهسازی برای عملکرد زمان اجرا، و
- برنامه را طوری تنظیم کنید که در حافظه جا شود (که معنی آن وابسته به پلتفرم است)
سطح بهینهسازی
مشابه پرچمهای -O در gcc یا clang، این فیلد به کاربر اجازه میدهد تا بر میزان کاری که کامپایلر برای بهینهسازی زمان اجرا انجام میدهد، تأثیر بگذارد. این فیلد را میتوان از طریق فیلد optimization_level از پیام ExecutableBuildOptionsProto یا فیلد optimization_level از پیام ExecutionOptions تنظیم کرد.
سطوح بهینهسازی پایینتر باعث میشود که مسیرهای مختلف HLO رفتار متفاوتی داشته باشند، معمولاً کار کمتری انجام میدهند، یا ممکن است مسیرهای HLO خاصی را به طور کامل غیرفعال کنند. سطح بهینهسازی همچنین ممکن است بر backend کامپایلر تأثیر بگذارد، به طوری که تأثیر دقیق این فیلد به پلتفرم هدف بستگی دارد. با این حال، به عنوان یک راهنمای کلی، جدول زیر تأثیر کلی مورد انتظار هر مقدار را شرح میدهد:
| سطح | مورد استفاده |
|---|---|
| تلاش_O0 | سریعترین کامپایل، کندترین زمان اجرا |
| تلاش_O1 | کامپایل سریعتر با زمان اجرای معقول |
| تلاش_O2 | اولویتبندی قوی زمان اجرا (پیشفرض مناسب برای حجم کار عملیاتی) |
| تلاش_O3 | بهینهسازیهای پرهزینه یا آزمایشی |
استفاده در XLA:GPU
در XLA:GPU، چندین مرحله وجود دارد که ما به طور پیشفرض غیرفعال میکنیم زیرا با افزایش اندازه HLO، زمان کامپایل را به میزان قابل توجهی افزایش میدهند. برای راحتی، آنها را در گزینه سطح بهینهسازی ادغام میکنیم، به طوری که تنظیم optimization_level روی O1 یا بالاتر منجر به رفتار زیر خواهد شد:
- مجموعههایی که معمولاً برای ارتباط موازی دادهها استفاده میشوند، به صورت پایپلاین (pipeline) درخواهند آمد. این رفتار همچنین میتواند با فعال کردن پرچمهای جداگانه، به صورت جزئیتر هدایت شود.
-
xla_gpu_enable_pipelined_all_gather -
xla_gpu_enable_pipelined_all_reduce -
xla_gpu_enable_pipelined_reduce_scatter
-
- باز کردن حلقههای while به اندازه دو برابر. مانع حلقه را از بین میبرد که به طور بالقوه منجر به همپوشانی بهتر محاسبات-ارتباطات و کپیهای کمتر میشود.
-
xla_gpu_enable_while_loop_double_buffering
-
- ابزار زمانبندی پنهانسازی تأخیر، بخش عمدهی کار را برای پنهانسازی تأخیر ارتباط انجام خواهد داد.
-
xla_gpu_enable_latency_hiding_scheduler
-
- برای به حداکثر رساندن پهنای باند شبکه، گذرگاههای ترکیبی، مجموعههای خط لولهای را تا حداکثر حافظه موجود ترکیب میکنند. اگر حلقه از قبل در HLO ورودی باز شده باشد، بهینهسازی شروع نمیشود.
سطح برازش حافظه
یکی دیگر از گزینههای سطح تلاش، میزان تلاش کامپایلر برای «در حافظه جا گرفتن» برنامهی حاصل را کنترل میکند، که در آن «جا افتادن» و «حافظه» معانی وابسته به backend دارند (برای مثال، در XLA:TPU، این گزینه میزان تلاش کامپایلر برای نگه داشتن استفاده از حافظه با پهنای باند بالا (HBM) توسط TPU کمتر از ظرفیت HBM را کنترل میکند). این گزینه را میتوان از طریق فیلد memory_fitting_level از پیام ExecutableBuildOptionsProto یا فیلد memory_fitting_level از پیام ExecutionOptions تنظیم کرد.
همانند سطح بهینهسازی، معنای دقیق هر مقدار سطح تلاش به بخش مدیریت بستگی دارد، اما جدول زیر تأثیر مورد انتظار را به عنوان یک راهنمای کلی شرح میدهد:
| سطح | مورد استفاده |
|---|---|
| تلاش_O0 | حداقل تلاش برای جا دادن (در عوض، کامپایل در اسرع وقت با شکست مواجه میشود) |
| تلاش_O1 | کاهش تلاش برای جا افتادن |
| تلاش_O2 | تلاش قابل توجه برای تطبیق (پیشفرض مناسب برای حجم کار تولید) |
| تلاش_O3 | الگوریتمهای گرانقیمت یا آزمایشی برای کاهش استفاده از حافظه |