-mpmd-absorb-inferred-fragments

মূল টুকরা অনুমানকৃত টুকরা শোষণ করে।

রুট ফ্র্যাগমেন্টগুলি অনুমানকৃত খণ্ডগুলিকে শোষণ করে, যেমন, অনুমানকৃত প্রযোজক/ভোক্তা খণ্ডগুলিকে রুট খণ্ডে একত্রিত করে, যেখানে একটি রুট খণ্ড হল যেকোনো খণ্ড যা হল:

  • একটি ব্যবহারকারী খণ্ড, বা
  • অন্য কোন খণ্ড দ্বারা ব্যবহার করা হয় না (যেমন, রিটার্ন অপ বা শুধুমাত্র একটি স্থানান্তর দ্বারা ব্যবহৃত একটি খণ্ড), বা
  • অন্য কোনো খণ্ডের দ্বারা উত্পাদিত মানের ব্যবহারকারী নয় (যেমন, ব্লক আর্গুমেন্ট বা স্থানান্তরের ব্যবহারকারী)।

এটি করার জন্য, পাসটি নিম্নলিখিত নিদর্শনগুলি প্রয়োগ করে, যতক্ষণ না এটি একটি নির্দিষ্ট বিন্দুতে পৌঁছায়:

(1) একটি রুট ফ্র্যাগমেন্ট rf দেওয়া হয়েছে, যদি একটি অনুমানকৃত খণ্ড ipf থাকে যেমন ipf হল rf এর প্রযোজক এবং rf হল ipf এর নিকটতম ভোক্তা, তাহলে ipf rf এ একত্রিত হয়।

এবং দ্বৈত:

(2) একটি রুট ফ্র্যাগমেন্ট rf দেওয়া, যদি একটি অনুমানকৃত ভোক্তা icf থাকে যেমন icf হল rf এর ভোক্তা এবং rf হল icf এর নিকটতম প্রযোজক, তাহলে icf rf এ একত্রিত হয়।

এর মানে আমরা ব্যবহারকারীর দ্বারা সংজ্ঞায়িত প্রোগ্রামের গঠন/আকৃতি সংরক্ষণ করি, নাম গণনা এবং স্টেজ/মেশ অ্যাসাইনমেন্টের মাধ্যমে।

মনে রাখবেন যে এই পাসটি অনুমানকৃত খণ্ডগুলিকে একত্রিত করার ক্ষেত্রে বেশ আক্রমনাত্মক, এবং বিশেষত, এটি বিভিন্ন পর্যায়ে ছোট পার্থক্য সৃষ্টি করতে পারে যা কম্পাইল করার জন্য অনন্য খণ্ডের সংখ্যা বাড়াতে পারে।

এই পাসটি আমাদের সতর্ক করবে যদি চূড়ান্ত নন-এন্ট্রি-পয়েন্ট ফাংশনগুলিতে এখনও অনুমানকৃত খণ্ডগুলি অন্তর্ভুক্ত থাকে, কারণ এটি কর্মক্ষমতা সমস্যা সৃষ্টি করতে পারে (যেমন, গ্রেডিয়েন্ট জমা ভুল হয়ে গেছে)।

অপশন

-absorb-on-entry-point-function : Whether to absorb inferred fragments into user-defined fragments on entry-point functions, in addition to targets of mpmd.calls.

-mpmd-call-inline

ইনলাইন সব mpmd.call অপারেশন.

ইনলাইন mpmd.call অপারেশন, যেকোন ইনলাইনড অপারেশনে তাদের অ্যাট্রিবিউট কপি করে।

-mpmd-copy-constants

তাদের ভোক্তাদের কাছে একটি খণ্ডে উত্পাদিত ধ্রুবক কপি করে।

তাদের প্রযোজক খণ্ড থেকে তাদের ভোক্তা খণ্ডে ধ্রুবক কপি করে, সম্ভবত স্থানান্তরের মাধ্যমে।

উদাহরণ:

%f = fragment () () {
  return constant
}
%t = transfer %f
fragment (%t) (%arg) {
  op(... %arg ...)
  ...
}

 ~~>

%f = fragment () () {
  return constant
}
%t = transfer %f
fragment (%t) (%arg) {
  %c = constant
  op(... %c ...)
  ...
}

এটি রানটাইম পারফরম্যান্সের জন্য উপকারী হতে পারে: এটি তার ব্যবহারকারীদের সাথে ধ্রুবককে একসাথে রেখে সম্ভাব্য অপ্টিমাইজেশন সক্ষম করে এবং এটি ধ্রুবকের স্থানান্তর এড়ায়। উপরন্তু, এটি মেমরি ব্যবহার উন্নত করবে: আমরা গণনার পরামিতিগুলির জন্য প্রয়োজনীয় স্থান হ্রাস করি।

-mpmd-erase-unused-callee-block-arguments

কোনো mpmd callee ব্লক আর্গুমেন্ট মুছে দেয় যা (hlo) গণনা দ্বারা ব্যবহৃত হয় না।

mpmd.calls দ্বারা কল করা ফাংশন থেকে অব্যবহৃত ব্লক আর্গুমেন্ট মুছে দেয়। আমরা একটি ব্লক আর্গুমেন্টকে অব্যবহৃত বলে বিবেচনা করি যদি এটির কোন ব্যবহার না থাকে বা শুধুমাত্র ফাংশনের টার্মিনেটর দ্বারা ব্যবহৃত হয়, অর্থাৎ, যদি এটি কোন hlo গণনা দ্বারা ব্যবহার না করা হয়।

-mpmd-fragment-dce

অব্যবহৃত ফ্র্যাগমেন্ট আর্গুমেন্ট/ফলাফল দূর করে এবং টুকরো অঞ্চলকে সরল করে।

অব্যবহৃত ফ্র্যাগমেন্ট আর্গুমেন্ট এবং ফলাফলগুলি সরিয়ে দেয়, যখন টুকরো অঞ্চলগুলিকে সরলীকরণ করে, মূলত মৃত MPMD কোড বাদ দেয়।

-mpmd-fragment-dedup

যেকোন সদৃশ অপারেন্ড মুছে দেয় এবং ফলস্বরূপ খন্ডিত হয়।

যেকোন সদৃশ ব্যবহৃত আর্গুমেন্ট মুছে দেয় এবং ফলস্বরূপ খন্ডিত হয়। এটি ডুপ্লিকেট আর্গুমেন্ট এবং ফলাফল অব্যবহৃত ছেড়ে দেবে। অব্যবহৃত আর্গুমেন্ট এবং ফলাফল মুছে ফেলার জন্য অন্যান্য পাস চালানো উচিত।

-mpmd-from-unroll-to-call-counter

একটি কল অপ-এর আনরোল কাউন্টার অ্যাটিআরকে একটি কল কাউন্টার অ্যাটিআর-এ রূপান্তর করে৷

যখনই একটি কল অপের একটি unroll_counter বৈশিষ্ট্য থাকে, এই পাস এটি একটি call_counter বৈশিষ্ট্য দিয়ে প্রতিস্থাপন করে। এটি এমন ক্ষেত্রে প্রয়োজন যেখানে পাইথন স্তরে একটি লুপ আনরোল করার পরিবর্তে MLIR-এ একটি লুপ আনরোল করার ফলে (যেমন -mpmd-unroll-for-loops এর মাধ্যমে) কলের একটি ক্রম পাওয়া যায়।

-mpmd-merge-forward-with-backward

পিছনের টুকরোগুলির সাথে সামনের অংশগুলিকে একত্রিত করুন।

একটি প্রযোজক ফরোয়ার্ড ফ্র্যাগমেন্টকে একটি ভোক্তা পশ্চাৎপদ খণ্ডের সাথে মার্জ করুন, যদি পূর্ববর্তীটি পরেরটির আগে থাকে। এটি শুধুমাত্র 1F1B সময়সূচীর শেষ পর্যায়ের জন্য সত্য, তাই এটি পূর্ববর্তী পর্যায়ের কোনো অংশকে একত্রিত করবে না, যা উদ্দেশ্যমূলক আচরণ।

-mpmd-merge-inferred-fragments

ব্যবহারকারীর সংজ্ঞায়িত টুকরাগুলির সাথে অনুমানকৃত খণ্ডগুলিকে একত্রিত করে৷

ব্যবহারকারী-সংজ্ঞায়িত বা অন্যান্য অনুমানকৃত খণ্ডের সাথে অনুমান করা একত্রিত করে। এই পাসটি মডিউলটিকে পরিষ্কার/সরল করার জন্য উপযোগী এবং অন্যান্য কম্পাইলার পাসের পরেও উপযোগী হতে পারে যা অনুমানকৃত খণ্ডগুলি প্রবর্তন করে, যখন উপরে -mpmd-transfer-aware-merge আরও আক্রমণাত্মক এবং শুধুমাত্র অপ্টিমাইজেশনের উদ্দেশ্যে ব্যবহার করা উচিত।

যখন clone_inferred_fragments=true , তখন এই মার্জিং পাসটি নির্দিষ্ট কিছু অংশকে ক্লোন করার অনুমতি দেয়। বিশেষ করে, যদি আমরা f1 এবং f2 এর এক জোড়া খন্ডের সম্মুখীন হই যেমন:

  • f2 ব্যবহার করে f1, এবং
  • f1 অনুমিত, বিশুদ্ধ এবং যথেষ্ট সহজ (একক নন-রিটার্ন অপ এবং একক ফলাফল), তারপর আমরা f1-এর একটি ক্লোনকে f2-তে মার্জ করি, অর্থাৎ, f1 নিজেই (এবং অন্যান্য ব্যবহারকারী) f2 থেকে স্বাধীন থাকে। ক্লোনিং ছাড়া অনুমানকৃত প্রযোজক খণ্ডগুলিকে একত্রিত করা অবাঞ্ছিত হতে পারে, কারণ এটি টুকরোগুলির মধ্যে অপ্রয়োজনীয় নির্ভরতা তৈরি করতে পারে। যেমন,
%inferred = frag m1 { return stablehlo.const  }
%frag1 = frag m1 (%inferred, )
%frag2 = frag m1 (%inferred, )

~>

%inferred_frag1 = frag m1 () {  return const_m1,  }
%frag2 = frag m2 (inferred_frag1, )

সুতরাং frag2 এখন inferred_frag1 এর উপর নির্ভর করে এবং আমরা একটি নির্ভরতা তৈরি করি।

যাইহোক, কখনও কখনও আমরা জায়গায় একত্রিত হতে চাই, যেমন, যখন অনুমানকৃত খণ্ডটির ভিতরে সমষ্টি থাকে।

অপশন

-clone-inferred-fragments : Whether to clone inferred fragments. Chains of clonable fragments are merged one-by-one into their consumers and recursively.
-merge-any-consumer       : Whether to merge with any consumer or only the closest consumer.
-merge-sideways           : Whether to merge with the next fragment in the same mesh (neighbor), even if not a consumer.

-mpmd-merge-transfers

ট্রান্সফারের সেটগুলিকে একত্রিত করে যা একই প্রযোজক এবং ভোক্তা খণ্ডগুলি ভাগ করে।

একই পেলোড টাইপের স্থানান্তরের সেটগুলিকে একত্রিত করে যা একই প্রযোজক এবং ভোক্তা খণ্ডগুলি ভাগ করে। এই স্থানান্তরগুলির পেলোড মানগুলিতে একটি প্রদত্ত থ্রেশহোল্ডের চেয়ে কম উপাদান রয়েছে, শার্ড করা হয় না এবং পিনড_হোস্টে থাকে না।

স্থানান্তরের একটি সেট একত্রিত করার অর্থ: প্রযোজকের সাইটে স্থানান্তরিত মানগুলিকে একত্রিত করা এবং ভোক্তা সাইটে তাদের বিভক্ত করা।

-mpmd-merge-user-fragments-into-scheduling-units

পাইপলাইন শিডিউলিং পাসের আগে ব্যবহারকারী ভিত্তিক টুকরো মার্জ করুন।

পাইপলাইন শিডিউলিং পাসের সাথে একত্রে ব্যবহার করার জন্য ব্যবহারকারীর সংজ্ঞায়িত টুকরাগুলির জোড়া একত্রিত করে।

-mpmd-move-transfers-to-producer

তাদের প্রযোজকদের পাশে স্থানান্তর করে।

তাদের প্রযোজকদের পাশে স্থানান্তর স্থানান্তরিত করে: যদি অপারেন্ডটি একটি ব্লক আর্গুমেন্ট হয়, তবে স্থানান্তরটিকে ব্লকের শুরুতে সরান, অন্যথায় সংজ্ঞায়িত অপের পরে এটি সরান।

-mpmd-remove-transfer-cycles

অপ্রয়োজনীয় স্থানান্তর এড়িয়ে প্রোগ্রাম থেকে শুধুমাত্র ডিভাইস স্থানান্তর চক্রগুলি সরিয়ে দেয়।

স্থানান্তর চক্র অপসারণ.

যেমন প্রতীকে:

x1 = স্থানান্তর(x0): m0 -> m1 x2 = স্থানান্তর(x1): m1 -> m2 x3 = স্থানান্তর(x2): m2 -> m3 x0_1 = স্থানান্তর(x3): m3 -> m0 x1_1 = স্থানান্তর(x0_1): m0 -> m1

~~>

x1 = স্থানান্তর(x0): m0 -> m1 x2 = স্থানান্তর(x1): m1 -> m2 x3 = স্থানান্তর(x2): m2 -> m3 x0_1 = x0 x1_1 = x1

অর্থাৎ আমরা তারপরে বিদ্যমান মানগুলি ব্যবহার করে অপ্রয়োজনীয় স্থানান্তরগুলি সরিয়ে চক্রটি ভেঙে ফেলি।

মনে রাখবেন যে এটি মেমরি ওভারহেড বাড়াতে পারে, যেহেতু ডেটা দূরে এবং পিছনে স্থানান্তর করার অর্থ হল এমন একটি সময়কাল যেখানে ডেটা ডিভাইসে নেই৷ সুতরাং, আমরা কেবল তখনই এটি করি যদি চক্রটিতে শুধুমাত্র ডিভাইস থেকে ডিভাইস স্থানান্তর থাকে, যেমন একটি device -> host -> device চক্র মেমরির উদ্দেশ্যে হতে পারে।

এটি MLIR ক্যানোনিকালাইজার ব্যবহার করে না, কারণ এটি গ্যারান্টি দেয় না যে সবকিছু ক্যানোনিকালাইজ করা হয়েছে এবং এটি প্রয়োগ করা আরও ব্যয়বহুল।

-mpmd-rule-based-merge

ব্যবহারকারী-সংজ্ঞায়িত নিয়মের উপর ভিত্তি করে খণ্ডগুলি মার্জ করে।

নিয়মগুলির একটি নির্দিষ্ট তালিকার উপর ভিত্তি করে খণ্ডগুলিকে একত্রিত করে, প্রতিটি একত্রিত করার জন্য উত্স খণ্ডের একটি তালিকা নির্দিষ্ট করে (তাদের খণ্ডের তথ্য দ্বারা) এবং মার্জ করা খণ্ডটিকে লেবেল করার লক্ষ্য তথ্য৷

অপশন

-rules                       : A list of fragment merge rules, each with a list of source fragment infos and a target fragment info.
-remove-control-dependencies : Whether to remove control dependencies at the end of the pass.

-mpmd-scheduling-units-verifier

প্রোগ্রামে প্রয়োজনীয় শিডিউলিং ইউনিট রয়েছে কিনা তা যাচাই করে।

-mpmd-sink-negligible-ops-into-call-op

কল-অপসে (অর্থাৎ, বলা ফাংশন) নগণ্য অপ্সকে ডুবিয়ে দেয়।

কথিত ফাংশনে সিঙ্ক (নগণ্য) অপ্স: যদি শূন্য অপারেন্ড সহ একটি অপ থাকে এবং একটি একক ফলাফল থাকে যা একই ফাংশনের সমস্ত কল অপের একটি নির্দিষ্ট অপারেন্ড হিসাবে ব্যবহৃত হয়, তাহলে আমরা এটিকে সেই কল অপ্স-এ সিঙ্ক করি, অর্থাত্, আমরা এটিকে বলা ফাংশনে ক্লোন করি এবং ক্লোনের সাথে সংশ্লিষ্ট আর্গুমেন্টের সমস্ত ব্যবহার প্রতিস্থাপন করি। কলারের ফাংশন থেকে ডুবে যাওয়া অপগুলি সরানো হয় এবং কলির অব্যবহৃত আর্গুমেন্টগুলি (এবং সংশ্লিষ্ট কল অপের অপারেন্ডগুলি) সরানো হয়। নোট করুন যে এটি মাইক্রোব্যাচিংয়ের জন্য কল অপস ব্যবহার করার সময় অনেকগুলি মাইক্রোব্যাচ জুড়ে গণনার নকল করতে পারে। যদিও, এই গণনাটি সম্ভবত নগণ্য কারণ এতে কোন অপারেন্ড লাগে না।

-mpmd-split-and-prioritize-transfer-independent-computations

স্থানান্তরিত ফলাফলের উপর ভিত্তি করে পশ্চাদগামী খন্ডগুলিকে বিভক্ত করে।

একটি খণ্ডকে দুটি খণ্ডে বিভক্ত করে, যাতে আমরা গণনা শুরু করতে পারি। অর্থাৎ আমরা খণ্ডটিকে দুটি খণ্ডে বিভক্ত করি A -> B, যেখানে A কোনো স্থানান্তর ফলাফলের উপর নির্ভর করে না, এবং সর্বাধিক বড়, এবং B স্থানান্তর ফলাফলের উপর নির্ভর করে।

-mpmd-split-bwd-fragments

স্থানান্তরিত ফলাফলের উপর ভিত্তি করে পশ্চাদগামী খন্ডগুলিকে বিভক্ত করে।

পিছনের অংশগুলিকে বিভক্ত করে যাতে স্থানান্তরিত ফলাফলগুলিতে প্রবাহিত না হওয়া যে কোনও গণনা তার নিজস্ব একটি খণ্ড হয়ে যায়। মূল খণ্ডটি কিছু অবশিষ্ট মান ফিরিয়ে দেবে যা বিভক্ত-আউট টুকরাগুলিতে অতিরিক্ত অপারেন্ড হিসাবে পাস করা হবে।

এই বিভাজনটি আমাদের আগে অন্যান্য মেশে ফলাফল স্থানান্তর করার অনুমতি দেয়। এই অপ্টিমাইজেশনের একটি ক্যানোনিকাল ব্যবহার প্যারামিটার গ্রেডিয়েন্ট গণনা থেকে ব্যাক-প্রচারে অ্যাক্টিভেশন গ্রেডিয়েন্ট গণনাকে বিভক্ত করবে। এছাড়াও নোট করুন যে নতুন টুকরাগুলিতে কিছু অবশিষ্ট মানগুলির মাধ্যমে সম্ভাব্যভাবে থ্রেড করার প্রয়োজনের কারণে, মেমরির চাপ বৃদ্ধি পাবে।

-mpmd-uniquify-function-inputs-outputs

একাধিকবার প্রত্যাবর্তিত যেকোন মান বা ফাংশন দ্বারা সরাসরি প্রত্যাবর্তিত যেকোনো ব্লক আর্গুমেন্টকে স্বতন্ত্র করে।

যদি একটি ফাংশন একই মান একাধিকবার প্রদান করে, সেই মানের জন্য একাধিক সংস্করণ তৈরি করে, সেই মানের জালের জন্য নির্ধারিত একটি খণ্ড তৈরি করে যা একাধিক বার মান প্রদান করে। এই পাসের পরে, প্রতিটি রিটার্ন অপারেন্ড অনন্য। নিম্নলিখিত jax.jit উদাহরণের মতো বিভিন্ন বাফারে সংশ্লিষ্ট ফলাফলগুলি বরাদ্দ করা হয়েছে তা নিশ্চিত করার জন্য এটি গুরুত্বপূর্ণ:

def f(x):
  y = x + x
  return y, y

z1, z2 = f(5)
z1 += 1
print(z1) ~~> 6
print(z2) ~~> 5

একইভাবে, যদি একটি ফাংশন একটি ব্লক আর্গুমেন্ট প্রদান করে, এই পাসটি সেই ব্লক আর্গুমেন্টের জন্য একটি আইডেন্টিটি ফ্র্যাগমেন্ট তৈরি করে, গ্যারান্টি দেয় যে মানগুলি ফাংশনে মানের দ্বারা পাস করা হয়, রেফারেন্স দ্বারা নয়।

অপশন

-use-transfer-instead-of-fragment : Whether to use mpmd.transfer or mpmd.fragment for uniquification

-mpmd-unroll-for-loops

mpmd.for loops সম্পূর্ণরূপে আনরোল করে।

একটি পাস তৈরি করে যা সম্পূর্ণরূপে mpmd.for ops আনরোল করে, প্রতিটি আনরোল করা অপের সাথে একটি unroll_counter বৈশিষ্ট্য সংযুক্ত করার সময়।

প্রয়োজন: আনরোল ফ্যাক্টরটি পুনরাবৃত্তির সংখ্যার সমান হতে হবে।

-mpmd-verify-stage-merging

যাচাই করে যে ধাপে বরাদ্দ করা টুকরোগুলির মার্জ সফল হয়েছে৷

যাচাই করে যে স্টেজ অ্যাসাইনমেন্টের সাথে অংশগুলি সঠিকভাবে মার্জ করা হয়েছে৷ এর অর্থ হ'ল অ্যাসাইনমেন্ট এবং কাউন্টারের ক্ষেত্রে মডিউলে দুটি সমতুল্য টুকরো থাকা সম্ভব নয়।

অ্যাসাইনমেন্ট এবং কাউন্টারের ক্ষেত্রে দুটি খণ্ড সমান। তারা একই জাল বরাদ্দ করা হয়, b. তারা একই পর্যায়ে বরাদ্দ করা হয়, গ. তাদের একই ট্রান্সপোজ গণনা আছে, এবং ঘ। হয় উভয়েরই একই কল কাউন্টার রয়েছে বা তাদের একটির একটি কল কাউন্টার সংজ্ঞায়িত নেই (অর্থাৎ, একটি অনির্ধারিত কল কাউন্টার যে কোনও কল কাউন্টারের সাথে মেলে)।

ব্যবহারকারীকে গ্যারান্টি দেওয়ার জন্য এটি প্রয়োজন যে একই পর্যায়ে নির্ধারিত যে কোনও গণনা ধারাবাহিকভাবে কার্যকর করা হয়েছে।