প্রতীকী অভিব্যক্তি এবং মানচিত্র

একটি সিম্বলিক এক্সপ্রেশন ( SymbolicExpr ) হলো একটি গাণিতিক অ্যাবস্ট্রাকশন সিস্টেম যা সিম্বলিক টেনসর কম্পিউটেশনকে সম্ভব করে তোলে। একটি সিম্বলিক ম্যাপ ( SymbolicMap ) হলো সিম্বলিক এক্সপ্রেশনসমূহের একটি সংগ্রহ, যা কম্পাইলেশন পাইপলাইনে টেনসর ম্যাপিং এবং ট্রান্সফরমেশনকে গাণিতিকভাবে উপস্থাপন করে। এগুলি একটি উচ্চ-স্তরের HLO অপারেশন এবং GPU/CPU দ্বারা অ্যাক্সেস করা প্রকৃত মেমরি অ্যাড্রেসগুলির মধ্যে "গাণিতিক সেতু" হিসাবে কাজ করে।

SymbolicExpr এবং SymbolicMap হলো XLA-এর নিজস্ব বাস্তবায়ন, যা পুরোনো mlir::AffineExpr এবং mlir::AffineMap প্রতিস্থাপন করে।

SymbolicExpr

একটি SymbolicExpr একটি অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST)-এর একটি নোডকে প্রতিনিধিত্ব করে। স্ট্যান্ডার্ড MLIR Affine Expression-এর থেকে ভিন্ন, এটি আধুনিক 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 ডোমেন-নির্দিষ্ট সীমাবদ্ধতা সহ প্রতীকী মানচিত্র নিয়ে গঠিত। এটি আকৃতি ও টাইলিং বিশ্লেষণ এবং অপারেশন চেইন (যেমন ধারাবাহিক রিশেপিং, ট্রান্সপোজ, ব্রডকাস্ট, ইত্যাদি) অপ্টিমাইজড ইনডেক্সিং গণনার মধ্যে সংকুচিত করতে সক্ষম করে। ইনডেক্সিং বিশ্লেষণ- এ বাস্তব উদাহরণের মাধ্যমে আরও জানুন।