یک عبارت نمادین ( SymbolicExpr ) یک سیستم انتزاعی ریاضی است که محاسبات تانسور نمادین را امکانپذیر میکند. یک نگاشت نمادین ( SymbolicMap ) مجموعهای از عبارات نمادین است که به صورت ریاضی نگاشتها و تبدیلهای تانسور را در خط لوله کامپایل نشان میدهد. آنها به عنوان "پل ریاضی" بین یک عملیات HLO سطح بالا و آدرسهای حافظه واقعی که توسط GPU/CPU قابل دسترسی هستند، عمل میکنند.
SymbolicExpr و SymbolicMap پیادهسازیهای سفارشی XLA هستند که جایگزین mlir::AffineExpr و mlir::AffineMap قدیمی شدهاند.
SymbolicExpr
یک SymbolicExpr نشان دهنده یک گره در یک درخت نحوی انتزاعی (AST) است. برخلاف عبارت وابسته استاندارد MLIR، این عبارت از طیف وسیعتری از عملیات لازم برای کاشیکاری GPU مدرن پشتیبانی میکند.
مثالی از یک SymbolicExpr : d0 + s0 * 8
انواع پشتیبانی شده
ثابتها: مقادیر صحیح ثابت ( int64 ).
متغیرها: متغیرهای نمادین با ابعاد (d) و نمادها (s) . همه متغیرها (ابعاد و نمادها) به عنوان VariableID در نظر گرفته میشوند و تفسیر یک متغیر به زمینه آن در یک نقشه نمادین بستگی دارد.
عملیات: add ، mul mod ، floorDiv ، ceilDiv ، min ، max .
عملگرهای پشتیبانیشده: + ، - ، * ، / ( floorDiv )، % ( mod )
مثال استفاده
v0 = CreateSymbolicVariable(0, context); // 0 is the var_id
v1 = CreateSymbolicVariable(1, context);
SymbolicExpr expr = (((v0 + 42) * v1.min(2).max(0)) / 2).ceilDiv(2);
int64_t result = expr.Evaluate({5, 1}); // Result: 12
ویژگیهای کلیدی
تغییرناپذیری : عبارات نمادین، دستگیرههایی شبیه به اشارهگر به حافظه داخلی هستند که توسط
mlir::MLIRContextمدیریت میشوند. آنها به طور خودکار دادههای تکراری را حذف میکنند تا منحصر به فرد بودن آنها تضمین شود.کانونیسازی (
Canonicalize()) : عبارات نمادین به صورت جبری سادهسازی میشوند (با تا کردن مداوم، حذف همانی، خاصیت انجمنی، خاصیت توزیعی و غیره) تا اطمینان حاصل شود که عبارات به شکل استاندارد و حداقلی نمایش داده میشوند. به عنوان مثال،(d0 + 1) - 1بهd0ساده میشود. این امر برای بررسیهای برابری قابل پیشبینی (operator==) در عباراتی که از نظر ریاضی معادل هستند اما از نظر ساختاری متفاوت هستند، حیاتی است.
SymbolicMap
SymbolicMap یک نگاشت ریاضی از تبدیلات بین سیستمهای مختصات، معمولاً بین تانسورهای ورودی و خروجی، را نشان میدهد.
مثالی از یک SymbolicMap : (d0, d1)[s0, s1] -> (d0 + s0, d1 * s1)
مثال استفاده
SymbolicMap map = SymbolicMap::Get(
context,
2, // number of dimensions
1, // number of symbols
{d0 + s0, d1 * s1}); // SymbolicExprs
// Access components
int64_t num_dims = map.GetNumDims();
int64_t num_symbols = map.GetNumSymbols();
auto results = map.GetResults();
عملیات کلیدی
جایگزینی متغیر ( ReplaceDimsAndSymbols() ) : ابعاد و/یا نمادهای نگاشت را میتوان با عبارات دیگر جایگزین کرد، این امر امکان نگاشت مجدد فضاهای مختصات را فراهم میکند. برای مثال:
// c2 and c3: SymbolicConstants
// sample_map: (d0, d1)[s0, s1] -> (d0 + s0, d1 * s1)
sample_map.ReplaceDimsAndSymbols(
{d1, c2}, // New dimensions: Replace d0 with d1, d1 with c2
{c3, d0}, // New symbols: Replace s0 with c3, s1 with d0
2, // New number of dimensions
2) // New number of symbols
// Result: (d1 + c3, c2 * d0)
ترکیب ( Compose() ) : نقشههایی با ابعاد سازگار میتوانند ترکیب شوند. این امر تبدیلهای زنجیرهای را امکانپذیر میکند و مکانیسم اصلی برای ادغام چندین عملیات HLO در یک محاسبه شاخصگذاری واحد را تشکیل میدهد. به عنوان مثال:
map1: (d0, d1)[s0] -> (d0 + s0, d1 * 2)
map2: (d0)[s0] -> (d0 - 10, d0 + s0)
map1.compose(map2): (new_d0)[new_s0_map1, new_s0_map2] -> ((new_d0 - 10) + new_s0_map1, (new_d0 + new_s0_map2) * 2)
بهینهسازی ( CompressDims() / CompressSymbols() ) : با شناسایی و حذف متغیرهای بلااستفاده، نگاشتها را ساده میکند و منطق اندیسگذاری تولید شده را تا حد امکان ساده نگه میدارد. برای مثال:
map1: (d0, d1, d2)[s0] -> (d0 + d2, s0 * 5) // d1 is unused
map1.CompressDims(): (new_d0, new_d1)[new_s0] -> (new_d0 + new_d1, new_s0 * 5)
map2: (d0)[s0, s1, s2] -> {d0 + s2, s0 * 5} // s1 is unused
map2.CompressSymbols(): (new_d0)[new_s0, new_s1] -> (new_d0 + new_s1, new_s0 * 5)
SymbolicMap مبنای ریاضی IndexingMap را تشکیل میدهد، که نحوه نگاشت عناصر تانسور به یکدیگر را در معناشناسی HLO توصیف میکند.
IndexingMap شامل نقشههای نمادین با محدودیتهای خاص دامنه است. این ابزار امکان تجزیه و تحلیل شکل و کاشیکاری و ادغام زنجیرههای عملیاتی (مانند تغییر شکل متوالی، انتقال، پخش و غیره) را در محاسبه بهینه شاخصگذاری فراهم میکند. برای کسب اطلاعات بیشتر، به مثالهای ملموس در Indexing analysis مراجعه کنید.