आकार और लेआउट

XLA Shape प्रोटो (xla_data.proto) N-डाइमेंशन वाले ऐरे (अरे) की रैंक, साइज़, और डेटा टाइप के बारे में कम शब्दों में बताता है.

शब्दावली, नोटेशन, और कन्वेंशन

  • किसी कलेक्शन की रैंक, डाइमेंशन की संख्या के बराबर होती है. किसी कलेक्शन की सही रैंक, उन डाइमेंशन की संख्या होती है जिनका साइज़ एक से ज़्यादा होता है.

  • N डाइमेंशन वाले अरे के लिए, डाइमेंशन को 0 से N-1 तक नंबर दिया जाता है. डाइमेंशन नंबर, सुविधा के हिसाब से आर्बिट्रेरी लेबल हैं. इन डाइमेंशन नंबर का क्रम, आकार के लेआउट में कोई खास माइनर/मुख्य क्रम नहीं दिखाता. लेआउट Layout प्रोटो से तय किया जाता है.

  • कन्वेंशन के मुताबिक, डाइमेंशन को डाइमेंशन नंबर के बढ़ते क्रम में सूची में रखा जाता है. उदाहरण के लिए, [A x B x C] साइज़ वाली तीन डाइमेंशन वाली अरे के लिए, डाइमेंशन 0 का साइज़ A होता है, डाइमेंशन 1 का साइज़ B होता है, और डाइमेंशन 2 में साइज़ होता है C.

    एक्सएलए में कुछ सुविधाएं, Python जैसे नेगेटिव इंडेक्स के साथ भी काम करती हैं: डाइमेंशन -1 आखिरी डाइमेंशन है (N डाइमेंशन अरे के लिए, N-1 के बराबर). उदाहरण के लिए, ऊपर बताई गई 3-डाइमेंशन वाली कैटगरी के लिए, डाइमेंशन -1 का साइज़ C है, डाइमेंशन -2 का साइज़ B है, और इसी तरह अन्य डाइमेंशन.

  • दो, तीन, और चार डाइमेंशन वाली सरणियों में अक्सर डाइमेंशन से जुड़े खास अक्षर होते हैं. उदाहरण के लिए, 2D कलेक्शन के लिए:

    • डाइमेंशन 0: y
    • डाइमेंशन 1: x

    3D कलेक्शन के लिए:

    • डाइमेंशन 0: z
    • डाइमेंशन 1: y
    • डाइमेंशन 2: x

    4D कलेक्शन के लिए:

    • डाइमेंशन 0: p
    • डाइमेंशन 1: z
    • डाइमेंशन 2: y
    • डाइमेंशन 3: x
  • XLA एपीआई में मौजूद फ़ंक्शन, जो डाइमेंशन लेते हैं. ऐसा करके वे डाइमेंशन नंबर का क्रम बढ़ाते हैं. यह डाइमेंशन को initializer_list के तौर पर पास करते समय इस्तेमाल किए गए क्रम से मैच करता है; उदाहरण के लिए,

    ShapeUtil::MakeShape(F32, {A, B, C, D})

    एक आकार बनाएगा, जिसके डाइमेंशन साइज़ अरे में [A, B, C, D] क्रम होगा.

लेआउट

Layout प्रोटो से पता चलता है कि मेमोरी में कोई अरे कैसे दिखाया जाता है. Layout प्रोटो में ये फ़ील्ड शामिल होते हैं:

message Layout {
  repeated int64 minor_to_major = 1;
  repeated int64 padded_dimensions = 2;
  optional PaddingValue padding_value = 3;
}

माइनर-टू-मेजर डाइमेंशन का क्रम

सिर्फ़ minor_to_major फ़ील्ड ज़रूरी है. यह फ़ील्ड, आकार में डाइमेंशन के माइनर-टू-मेजर क्रम के बारे में बताता है. minor_to_major में दी गई वैल्यू, अरे के डाइमेंशन का क्रम (N डाइमेंशन वाली अरे के लिए 0 से N-1 तक) है. इसमें पहली वैल्यू, सबसे मुख्य डाइमेंशन तक की सबसे छोटी वैल्यू होगी. सबसे छोटा डाइमेंशन वह डाइमेंशन होता है जो लीनियर मेमोरी में तय किए गए ऐरे के एलिमेंट से गुज़रते समय सबसे तेज़ी से बदलता है.

उदाहरण के लिए, [2 x 3] साइज़ की इस 2D अरे पर विचार करें:

a b c
d e f

यहां डाइमेंशन 0, साइज़ 2 है और डाइमेंशन 1, साइज़ 3 है. अगर लेआउट में minor_to_major फ़ील्ड [0, 1] है, तो डाइमेंशन 0 सबसे छोटा डाइमेंशन और 1 सबसे मुख्य डाइमेंशन है. यह लीनियर मेमोरी में नीचे दिए गए लेआउट के हिसाब से होता है:

a d b e c f

0 का यह माइनर-टू-मेजर डाइमेंशन ऑर्डर, N-1 तक का है. यह कॉलम-मेजर (रैंक 2 पर मौजूद) के जैसा है. डाइमेंशन का एक मोनोटोनिक ऑर्डर मानते हुए, कोड में इस लेआउट को देखने का दूसरा तरीका यह है कि "डिम 0 माइनर है".

वहीं दूसरी ओर, अगर लेआउट में minor_to_major फ़ील्ड [1, 0] है, तो लीनियर मेमोरी में लेआउट:

a b c d e f

डाइमेंशन वाली N डाइमेंशन के लिए, N-1 से लेकर 0 तक का माइनर-टू-मजर डाइमेंशन ऑर्डर row-major (रैंक 2 पर) जैसा होता है. अगर यह मान लिया जाए कि डाइमेंशन एक ही क्रम में हैं, तो कोड में इस लेआउट को देखने का दूसरा तरीका यह है कि "डिम 0 मुख्य है".

डिफ़ॉल्ट माइनर-टू-मेजर ऑर्डर

नए बनाए गए आकार का डिफ़ॉल्ट लेआउट "डाइमेंशन का क्रम, मेजर-टू-माइनर है" (रैंक 2 पर मौजूद पंक्ति-प्रमुखता से मिलता-जुलता है) है.

पैडिंग (जगह)

पैडिंग (जगह) की जानकारी padded_dimensions और padding_value फ़ील्ड में दी जाती है. हालांकि, यह ज़रूरी नहीं है. padded_dimensions फ़ील्ड, उन साइज़ (चौड़ाई) के बारे में बताता है जिनमें हर डाइमेंशन पैड किया गया है. अगर मौजूद हो, तो padded_dimensions में एलिमेंट की संख्या आकार की रैंक के बराबर होनी चाहिए.

उदाहरण के लिए, ऊपर दी गई [2 x 3] कैटगरी के लिए, अगर padded_dimensions [3, 5] है, तो डाइमेंशन 0 की चौड़ाई तीन और डाइमेंशन 1 की चौड़ाई 5 होगी. लीनियर मेमोरी का लेआउट (यह मानते हुए कि पैडिंग वैल्यू 0 है और कॉलम-मेजर लेआउट यह है):

a d 0 b e 0 c f 0 0 0 0 0 0 0

यह इन अरे के लेआउट के बराबर है, जिनमें माइनर-टू-मेजर डाइमेंशन का एक ही क्रम है:

a b c 0 0
d e f 0 0
0 0 0 0 0

कैटगरी में इंडेक्स किया जा रहा है

index_util.h फ़ॉर्मैट में IndexUtil क्लास, आकार और लेआउट के हिसाब से कई डाइमेंशन वाले इंडेक्स और लीनियर इंडेक्स को बदलने के लिए सुविधाएं देती है. बहुआयामी इंडेक्स में हर डाइमेंशन के लिए एक int64 इंडेक्स होता है. लीनियर इंडेक्स, सिंगल int64 वैल्यू होती हैं जो अरे को होल्ड करके रखे गए बफ़र में इंडेक्स हो जाती है. आकृतियों और लेआउट को बनाना और उनमें बदलाव करना आसान बनाने वाली सुविधाओं के लिए, shape_util.h और layout_util.h को एक ही डायरेक्ट्री में देखें.