এই নথিটি XLA অ্যালিয়াসিং API বর্ণনা করে, যা আপনাকে XLA প্রোগ্রাম তৈরি করার সময় ইনপুট এবং আউটপুট বাফারগুলির মধ্যে অ্যালিয়াসিং নির্দিষ্ট করতে দেয়।
কম্পাইল-টাইমে অ্যালিয়াসিং সংজ্ঞায়িত করা
উদাহরণস্বরূপ, একটি তুচ্ছ HLO মডিউল বিবেচনা করুন যা তার ইনপুটে 1
যোগ করে:
HloModule increment
ENTRY entry {
%p = f32[] parameter(0)
%c = f32[] constant(1)
ROOT %out = f32[] add(%p, %c)
}
এই মডিউলটি দুটি 4-বাইট বাফার বরাদ্দ করবে: একটি ইনপুট %p
এর জন্য এবং একটি আউটপুট %out
এর জন্য।
যাইহোক, প্রায়শই আপডেটটি জায়গায় করা বাঞ্ছনীয় (উদাহরণস্বরূপ, যদি ফ্রন্টএন্ডে এক্সপ্রেশন তৈরি করে ইনপুট ভেরিয়েবলটি গণনার পরে আর জীবিত থাকে না, যেমন ইনক্রিমেন্ট p++
)।
এই ধরনের একটি আপডেট দক্ষতার সাথে সম্পাদন করতে, আপনি ইনপুট উপনাম নির্দিষ্ট করতে পারেন:
HloModule increment, input_output_alias={ {}: 0 }
ENTRY entry {
%p = f32[] parameter(0)
%c = f32[] constant(1)
ROOT %out = f32[] add(%p, %c)
}
বিন্যাসটি নির্দিষ্ট করে যে সম্পূর্ণ আউটপুট ( {}
দ্বারা চিহ্নিত) ইনপুট প্যারামিটার 0
এর সাথে উপনাম করা হয়েছে।
প্রোগ্রাম্যাটিকভাবে অ্যালিয়াসিং নির্দিষ্ট করতে, XlaBuilder::SetUpAlias
API দেখুন।
রানটাইমে অ্যালিয়াসিং সংজ্ঞায়িত করা
পূর্ববর্তী ধাপে সংজ্ঞায়িত অ্যালিয়াসিং সংকলনের সময় নির্দিষ্ট করা হয়। কার্যকর করার সময়, আপনি বাফার দান করবেন কিনা তা চয়ন করতে LocalClient::RunAsync
API ব্যবহার করতে পারেন।
প্রোগ্রামের ইনপুট বাফারগুলি ExecutionInput
s-এ মোড়ানো হয়, যার ফলে MaybeOwningDeviceMemory
এর একটি ট্রি থাকে। যদি মেমরি মালিকানা হিসাবে নির্দিষ্ট করা হয় (বাফারের মালিকানা XLA রানটাইমে পাস করা হয়), বাফারটি আসলে দান করা হয়, এবং কম্পাইল-টাইম অ্যালিয়াসিং API দ্বারা অনুরোধ অনুযায়ী আপডেটটি কার্যকর করা হয়।
যাইহোক, যদি কম্পাইলের সময় উপনামযুক্ত বাফারটি রানটাইমে দান না করা হয়, তাহলে অনুলিপি-সুরক্ষা শুরু হয়: একটি অতিরিক্ত আউটপুট বাফার O
বরাদ্দ করা হয়, এবং ইনপুট বাফার P
এর বিষয়বস্তু যা উপনাম করার জন্য ছিল তা O
তে অনুলিপি করা হয়। (তাই কার্যকরভাবে প্রোগ্রামটি কার্যকর করতে পারে যেন বাফার O
রানটাইমে দান করা হয়েছিল)।