-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
(hlo) গণনার কাজে ব্যবহৃত হয় না এমন যেকোনো mpmd ক্যালি ব্লক আর্গুমেন্ট মুছে ফেলে।
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
অনুমানকৃত খণ্ডাংশগুলোকে ব্যবহারকারী-সংজ্ঞায়িত খণ্ডাংশগুলোর সাথে একীভূত করে।
ব্যবহারকারী-সংজ্ঞায়িত বা অন্যান্য অনুমিত খণ্ডাংশের সাথে অনুমিত খণ্ডাংশগুলিকে একত্রিত করে। এই ধাপটি মডিউলটিকে পরিচ্ছন্ন/সরল করার জন্য উপযোগী এবং অন্যান্য কম্পাইলার ধাপের পরেও কার্যকর হতে পারে, যেগুলো অনুমিত খণ্ডাংশ যুক্ত করে।
বিকল্প
-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
একই প্রডিউসার এবং কনজিউমার ফ্র্যাগমেন্ট শেয়ার করে এমন ট্রান্সফারের সেটগুলিকে একত্রিত করে।
একই পেলোড টাইপের এবং একই প্রডিউসার ও কনজিউমার ফ্র্যাগমেন্ট শেয়ার করে এমন ট্রান্সফারের সেটগুলিকে একত্রিত করে। এই ট্রান্সফারগুলির পেলোড ভ্যালুতে একটি নির্দিষ্ট থ্রেশহোল্ডের চেয়ে কম উপাদান থাকে, এগুলি শার্ড করা হয় না এবং pinned_host-এ থাকে না।
একাধিক ট্রান্সফার একত্রিত করার অর্থ হলো: উৎপাদক পর্যায়ে স্থানান্তরিত মানগুলোকে সংযুক্ত করা এবং গ্রাহক পর্যায়ে সেগুলোকে বিভক্ত করা।
-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 চক্র মেমোরির উদ্দেশ্যে হতে পারে।
এটি এমএলআইআর ক্যানোনিকালাইজার ব্যবহার করে না, কারণ সেটি সবকিছু ক্যানোনিকালাইজড হওয়ার নিশ্চয়তা দেয় না এবং এটি প্রয়োগ করাও অধিক ব্যয়বহুল।
-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 লুপগুলোকে সম্পূর্ণরূপে খুলে দেয়।
এমন একটি পাস তৈরি করে যা mpmd.for অপসগুলোকে সম্পূর্ণরূপে আনরোল করে এবং প্রতিটি আনরোল করা অপ-এর সাথে একটি unroll_counter অ্যাট্রিবিউট যুক্ত করে।
প্রয়োজন: আনরোল ফ্যাক্টরকে ইটারেশনের সংখ্যার সমান হতে হবে।
-mpmd-verify-stage-merging
পর্যায়গুলিতে নির্ধারিত খণ্ডাংশগুলির একত্রীকরণ সফল হয়েছে কিনা তা যাচাই করে।
স্টেজ অ্যাসাইনমেন্ট সহ ফ্র্যাগমেন্টগুলো সঠিকভাবে মার্জ করা হয়েছে কিনা তা যাচাই করে। এর মানে হলো, অ্যাসাইনমেন্ট এবং কাউন্টারের দিক থেকে মডিউলটিতে কোনো দুটি সমতুল্য ফ্র্যাগমেন্ট থাকা সম্ভব নয়।
দুটি ফ্র্যাগমেন্ট অ্যাসাইনমেন্ট এবং কাউন্টারের দিক থেকে সমতুল্য হবে যদি এবং কেবল যদি ক. সেগুলোকে একই মেশে অ্যাসাইন করা হয়, খ. সেগুলোকে একই স্টেজে অ্যাসাইন করা হয়, গ. তাদের ট্রান্সপোজ কাউন্ট একই হয়, এবং ঘ. হয় উভয়ের কল কাউন্টার একই হয় অথবা তাদের মধ্যে একটির কোনো কল কাউন্টার সংজ্ঞায়িত না থাকে (অর্থাৎ, একটি অসংজ্ঞায়িত কল কাউন্টার যেকোনো কল কাউন্টারের সাথে মিলে যায়)।
ব্যবহারকারীকে এটা নিশ্চিত করার জন্য এটি প্রয়োজন যে একই স্টেজে নির্ধারিত যেকোনো গণনা ধারাবাহিকভাবে সম্পাদিত হয়।