ত্রুটি কোড: E2003

বিভাগ: কম্পাইল সময়: মোজাইক অপ্রমাণিত মেমরি অ্যাক্সেস অ্যালাইনমেন্ট

এই ত্রুটিটি তখন ঘটে যখন কম্পাইলার একটি মেমরি অ্যাক্সেস অপারেশন (যেমন vector.load , vector.store , tpu.load , অথবা tpu.store ) বিশ্লেষণ করে এবং স্ট্যাটিকভাবে প্রমাণ করতে পারে না যে একটি নির্দিষ্ট মাত্রার জন্য ব্যবহৃত গতিশীল সূচকটি প্রয়োজনীয় টাইলিং আকারের গুণিতক।

নমুনা ত্রুটি বার্তা:

INTERNAL: Mosaic failed to compile TPU kernel: cannot statically prove that index in dimension 1 is a multiple of 128

at location: ...

The MLIR operation involved:
  %14372 = "vector.load"(%14371, %93, %14363) : (memref<4x256xf32, #tpu.memory_space<vmem>>, index, index) -> vector<1x32xf32>

XLA ব্যাকএন্ড: TPU

সংক্ষিপ্ত বিবরণ

যখন আপনার কার্নেল একটি ভেক্টর লোড বা স্টোর করে, তখন মেমরি অ্যাড্রেস (বেস পয়েন্টার প্লাস ডাইনামিক ইনডেক্স থেকে গণনা করা হয়) অবশ্যই হার্ডওয়্যারে ভেক্টরের টাইলিং আকারের সাথে সারিবদ্ধ হতে হবে। উদাহরণস্বরূপ, যদি একটি ডাইমেনশন 128টি এলিমেন্ট দ্বারা টাইল করা হয়, তাহলে এটি অ্যাক্সেস করার জন্য ব্যবহৃত ডাইনামিক ইনডেক্স অবশ্যই 0 , 128 , 256 , ইত্যাদি হতে হবে। মনে রাখবেন যে অনেক অপারেশন (যেমন ভেক্টর লোড এবং স্টোর) স্ট্যাটিক ইনডেক্সের জন্য এই ধরনের কোনও প্রয়োজনীয়তা রাখে না।

কম্পাইলার স্ট্যাটিক বিশ্লেষণ ব্যবহার করে এই প্রয়োজনীয়তা প্রয়োগ করে। এটি সূচক ভেরিয়েবলের ইতিহাসকে গাণিতিক ক্রিয়াকলাপের মাধ্যমে ট্রেস করে যা এটি তৈরি করেছিল (যেমন, গুণ, যোগ)। যদি কম্পাইলার (কম্পাইলের সময়) গ্যারান্টি দিতে না পারে যে ফলাফলের মান সর্বদা টাইলিং আকার দ্বারা বিভাজ্য হবে, তাহলে এটি এই ত্রুটিটি উত্থাপন করে।

কম্পাইলারটি "প্রমাণিত মিসঅ্যালাইনমেন্ট" এবং "অজানা অ্যালাইনমেন্ট" একইভাবে ব্যবহার করে। তাই যদি আপনি এমন একটি সূচক ব্যবহার করেন যা গাণিতিকভাবে মিসঅ্যালাইনমেন্ট হওয়ার নিশ্চয়তা দেয় (যেমন, i * 128 + 32 ), কম্পাইলারটি একই ত্রুটি দেখাবে।

তাই এই ত্রুটিটি ঘটতে পারে যখন

  1. মেমরি অ্যাক্সেস করার জন্য আপনি একটি রানটাইম ভেরিয়েবল (ডায়নামিক ইনডেক্স) ব্যবহার করেন।
  2. সূচক গণনার যুক্তি কম্পাইলারের পক্ষে বিশ্লেষণ করা খুব জটিল।
  3. সূচকটি গাণিতিকভাবে বৈধ কিন্তু কোডে এর স্পষ্ট প্রমাণের অভাব রয়েছে।
  4. স্ট্যাটিক বিশ্লেষণ "প্রমাণিত ভুল বিন্যাস" নির্ধারণ করে।

ডিবাগিং

এই ত্রুটিটি সমাধান করার জন্য আপনার কাছে নিম্নলিখিত বিকল্পগুলি রয়েছে:

১. স্পষ্টভাবে সারিবদ্ধকরণ নিশ্চিত করুন

যদি আপনি জানেন যে আপনার সূচকটি বৈধ কিন্তু কম্পাইলার তা প্রমাণ করতে পারে না, তাহলে tpu.assume_multiple অপারেশনটি ব্যবহার করুন। এটি কম্পাইলারকে একটি প্রতিশ্রুতি হিসেবে কাজ করে যে একটি মান একটি নির্দিষ্ট গুণনীয়ক দ্বারা বিভাজ্য।

2. সারিবদ্ধ লোড ব্যবহার করুন এবং ঘোরান

যেসব পরিস্থিতিতে ভুল সারিবদ্ধকরণ ইচ্ছাকৃত, সেখানে একটি ছোট, অ-সারিবদ্ধ ভেক্টর অংশ লোড করার পরিবর্তে:

  • একটি বৃহত্তর, সম্পূর্ণরূপে সারিবদ্ধ টাইল লোড করুন এবং তারপর পছন্দসই ডেটা অবস্থানে স্থানান্তর করতে মানগুলিকে একটি গতিশীল পরিমাণে ঘোরান (যেহেতু গতিশীল স্টার্ট সূচক সহ ভেক্টর স্লাইস সমর্থিত নয়)। অথবা
  • টেনসরটিকে পুনরায় আকার দিন বা প্যাড করুন যাতে ডেটা সূচক 0 থেকে শুরু হয় এবং অ্যাক্সেসের মধ্যে স্ট্রাইড হার্ডওয়্যার সারিবদ্ধতার সাথে মেলে।
    • উদাহরণ: যদি আপনি অফসেট ১ থেকে শুরু করে ৩২ সাইজের কিছু অংশ পুনরাবৃত্তি করেন, তাহলে আপনার অফসেটগুলি হবে ১, ৩৩, ৬৫... (অসংলগ্ন)।
    • ঠিক করুন: ডেটাটিকে একটি নতুন টেনসরের মধ্যে পুনরায় প্যাক করুন যেখানে প্রথম অংশটি 0 এ থাকবে এবং মাত্রাটি 128 এ প্যাড করা হবে। আপনার অফসেটগুলি 0, 128, 256... হয়ে যাবে, যা সারিবদ্ধকরণের প্রয়োজনীয়তা পূরণ করে।

এই পদ্ধতিগুলি বেশি মেমরি ব্যবহার করে কিন্তু প্রায়শই কার্নেল লজিককে সরল করে এবং ম্যানুয়াল অ্যালাইনমেন্ট অ্যাসারেন্সের প্রয়োজনীয়তা দূর করে।