หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

เค้าโครงกระเบื้อง

รูปที่ 1

รูปที่ 1 แสดงวิธีวางอาร์เรย์ F32 [3,5] ในหน่วยความจำด้วยการเรียงต่อเนื่อง 2x2 รูปร่างที่มีเลย์เอาต์นี้เขียนเป็น F32 [3,5] {1,0: (2,2)} โดยที่ 1,0 เกี่ยวข้องกับลำดับทางกายภาพของมิติ (ฟิลด์ minor_to_major ในเค้าโครง) ขณะที่ (2,2) หลังจาก เครื่องหมายโคลอนบ่งบอกการเรียงตัวของมิติฟิสิคัลโดย 2x2 ไทล์

การปูกระเบื้องอย่างสังหรณ์ใจจะถูกจัดวางเพื่อให้ครอบคลุมรูปร่างและจากนั้นภายในแต่ละชิ้นส่วนองค์ประกอบจะถูกจัดวางโดยไม่มีการเรียงต่อกันดังตัวอย่างด้านบนที่ส่วนด้านขวาของตัวอย่างแสดงเค้าโครงในหน่วยความจำรวมถึงองค์ประกอบการขยายสีขาว เพื่อให้มีไทล์ 2x2 ที่สมบูรณ์แม้ว่าขอบเขตอาเรย์ดั้งเดิมจะไม่เท่ากัน

องค์ประกอบพิเศษในการขยายไม่จำเป็นต้องมีค่าเฉพาะใด ๆ

สูตรดัชนีเชิงเส้นสำหรับการปูกระเบื้องกำหนดรูปร่างและกระเบื้อง

องค์ประกอบ e = (e n , e n-1 , ... , e 1 ) ในอาร์เรย์ที่มีขอบเขตอาร์เรย์ d = (d n , d n-1 , ... , d 1 ) (d1 คือ ส่วนข้อมูลย่อยมากที่สุด) ถูกวางโดยคำสั่งซื้อหลักไปยังตำแหน่งรอง:

linear_index (e, d)
= linear_index ((e n , e n-1 , ... , e 1 ), (d n , d n-1 , ... , d 1 ))
= e n d n-1 ... d 1 + e n-1 d n-2 ... d 1 + ... + e 1

เพื่อความง่ายในการจดบันทึกในเอกสารนี้เราจะถือว่าไทล์มีขนาดเท่ากับอาร์เรย์ ในการใช้งาน XLA ของการเรียงต่อกันนี่เป็นการวางนัยให้กับการเอียงที่มีมิติน้อยลงโดยปล่อยให้มิติที่สำคัญที่สุดเริ่มต้นไม่เปลี่ยนแปลง รูปร่างเป็นกระเบื้อง

เมื่อปูกระเบื้องขนาด (t n, T N-1, ... , T 1) ถูกนำมาใช้เป็นองค์ประกอบในอาร์เรย์ที่มีดัชนี (E n, E n-1, ... , E 1) ถูกแมปไปนี้ ตำแหน่งในเค้าโครงสุดท้าย:

linear_index_with_tile (e, d, t)
= linear_index ((⌊e / t⌋, e mod t), (⌈d / t⌉, t)) (การคำนวณทางคณิตศาสตร์คือ elementwise, (a, b) เป็นการต่อกัน)
= linear_index ((⌊e n / t n ⌋, ... , 1e 1 / t 1 ⌋, e n mod t n , ... , e 1 mod t 1 ), (⌈d n / t n ⌉, ... , ⌈d 1 / t 1 ⌉, t n , t n-1 , ... , t 1 ))
= linear_index ((⌊e n / t n ⌋, ... , 1e 1 / t 1 ⌋), (⌈d n / t n ⌉, ... , 1d 1 / t 1 ⌉)) ∙ t n T n-1 ... ที 1 + linear_index ((E n T สมัย n, ... , E 1 mod T 1) (T n, T n-1, ... , T 1))

เลย์เอาต์สามารถคิดได้ว่ามีสองส่วน: (⌊e n / t n ⌋, ... , 1e 1 / t 1 ⌋) ซึ่งสอดคล้องกับดัชนีกระเบื้องในอาร์เรย์ของขนาดของกระเบื้อง (⌈d n / t n ⌉, ... , ⌈d 1 / t 1 ⌉) และ (e n mod t n , ... , e 1 mod t 1 ) ซึ่งสอดคล้องกับดัชนีภายในกระเบื้อง ฟังก์ชั่น ceil จะปรากฏใน⌈d i / t i ⌉เพราะหากแผ่นกระเบื้องมีขนาดใหญ่เกินขอบเขตของอาร์เรย์ที่ใหญ่กว่าช่องว่างภายในจะถูกแทรกเช่นเดียวกับในรูปที่ 1 ทั้งแผ่นกระเบื้องและองค์ประกอบภายในแผ่นกระเบื้องจะถูกวางแบบเรียกซ้ำ

สำหรับตัวอย่างในรูปที่ 1 องค์ประกอบ (2,3) มีดัชนีเรียงตัว (1,1) และดัชนีเรียงซ้อนภายใน (0,1) สำหรับเวกเตอร์พิกัดร่วมที่ (1, 1, 0, 1) ดัชนีกระเบื้องมีขอบเขต (2, 3) และตัวกระเบื้องคือ (2, 2) สำหรับเวกเตอร์รวมของ (2, 3, 2, 2) ดัชนีเชิงเส้นพร้อมไทล์สำหรับองค์ประกอบที่มีดัชนี (2, 3) ในรูปร่างโลจิคัลคือ

linear_index_with_tile ((2,3), (3,5), (2,2))
= linear_index ((1,1,0,1), (2,3,2,2))
= linear_index ((1,1), (2,3)) ∙ 2 ∙ 2 + linear_index ((0,1), (2,2))
= (1 ∙ 3 + 1) ∙ 2 ∙ 2 + (0 ∙ 2 + 1)
= 17

เรียงต่อกันเป็นแผ่น reshape- เปลี่ยน

เค้าโครงแบบเรียงต่อกันทำงานดังนี้:
พิจารณาอาร์เรย์ของส่วนข้อมูล (d n , d n-1 , ... , d1) (d1 เป็นส่วนข้อมูลย่อยที่สุด) เมื่อมีการปูกระเบื้องขนาด (t n , t n-1 , ... , t 1 ) (t 1 เป็นมิติที่เล็กที่สุด) การเรียงต่อกันนั้นสามารถอธิบายได้ในแง่ของแผ่นปรับรูปร่าง - ไขว้ในต่อไปนี้ ทาง

  1. อาเรย์จะถูกใส่ลงใน (⌈d n / t n ⌉∙ t n , ... , 1d 1 / t 1 ⌉∙ t 1 )
  2. แต่ละมิติของ i ถูกแบ่งออกเป็น (⌈d i / t i ⌉, t i ), เช่นอาร์เรย์ถูกเปลี่ยนรูปร่างเป็น
    (nd n / t n ⌉, t n , ... , ⌈d 1 / t 1 ⌉, t 1 )
    ไม่มีการเปลี่ยนแปลงเค้าโครงทางกายภาพในการปรับรูปร่างนี้ด้วยตัวเองดังนั้นการปรับรูปร่างนี้จึงเป็นบิตแคสต์ หากไม่มีใครคิดอย่างชัดเจนเกี่ยวกับการปูกระเบื้องการก่อร่างใหม่นี้สามารถแสดงรูปร่างใด ๆ ที่มีองค์ประกอบจำนวนเท่ากันกับรูปร่างเบาะ - ตัวอย่างที่นี่เป็นวิธีการแสดงกระเบื้องด้วยวิธีนี้
  3. transpose เกิดขึ้นโดยการย้าย T N, ... , ที 1 ถึงที่สุดขนาดเล็ก ๆ น้อย ๆ ขณะที่การรักษาลำดับญาติของพวกเขาจึงว่าคำสั่งของมิติจากที่สำคัญที่สุดในการเล็ก ๆ น้อย ๆ ส่วนใหญ่จะกลายเป็น
    (nd n / t n ⌉, ... , ⌈d 1 / t 1 ⌉, t n , ... , t 1 )

รูปร่างสุดท้ายมีคำนำหน้า
(⌈d n / t n ⌉, ... , ⌈d 1 / t 1 ⌉) ซึ่งอธิบายจำนวนของไพ่ในแต่ละมิติ องค์ประกอบในอาร์เรย์ (e n , ... , e 1 ) ถูกแมปกับองค์ประกอบนี้ในรูปสุดท้าย:
(ne n / t n ⌋, ... , 0e 0 / t 0 ⌋, e n mod t n , ... , e 1 mod t 1 ) มันง่ายที่จะเห็นว่าดัชนีเชิงเส้นขององค์ประกอบตามสูตรข้างต้นตามที่คาดไว้

ปูกระเบื้องซ้ำ

การปูกระเบื้องของ XLA มีความยืดหยุ่นมากขึ้นโดยการใช้ซ้ำ ๆ

รูปที่ 2

รูปที่ 2 แสดงวิธีเรียงลำดับขนาด 4x8 ที่เรียงต่อกันด้วยสองระดับของการเรียงต่อกัน (2x4 แรกและ 2x1) เราเป็นตัวแทนการเรียงต่อกันซ้ำนี้เป็น (2,4) (2,1) แต่ละสีบ่งชี้ไพ่ 2x4 และกล่องขอบสีแดงแต่ละกล่องเป็นไพ่ 2x1 ตัวเลขแสดงดัชนีเชิงเส้นในหน่วยความจำขององค์ประกอบนั้นในรูปแบบเรียงต่อกัน รูปแบบนี้ตรงกับรูปแบบที่ใช้สำหรับ BF16 บน TPU ยกเว้นว่าไทล์เริ่มต้นใหญ่กว่าคือการเรียงต่อกันคือ (8,128) (2,1) โดยที่จุดประสงค์ของการเรียงลำดับที่สองโดย 2x1 คือการรวบรวมค่า 16 บิตสองค่า รูปแบบค่า 32 บิตหนึ่งในวิธีที่สอดคล้องกับสถาปัตยกรรมของ TPU

โปรดทราบว่าไทล์ที่สองหรือใหม่กว่าสามารถอ้างอิงทั้งมิติย่อยภายในไทล์รองซึ่งเพิ่งจัดเรียงข้อมูลภายในไทล์อีกครั้งในตัวอย่างนี้ด้วย (8,128) (2,1) แต่ยังสามารถอ้างถึงไขว้ไทล์หลัก ขนาดจากการเรียงต่อกันก่อนหน้า

รวมมิติโดยใช้แผ่นกระเบื้อง

การปูกระเบื้องของ XLA ยังรองรับการรวมมิติ ตัวอย่างเช่นสามารถรวมมิติใน F32 [2,7,8,11,10] {4,3,2,1,0} ลงใน F32 [112,110] {1,0} ก่อนปูด้วย (2,3) ) ไทล์ที่ใช้คือ (∗, ∗, 2, ∗, 3) นี่คือเครื่องหมายดอกจันในไทล์หมายถึงการใช้มิตินั้นและรวมเข้ากับมิติย่อยถัดไป หลายมิติที่อยู่ติดกันสามารถรวมเข้าด้วยกันเป็นมิติเดียว มิติย่อยที่แสดงด้วยค่าของกระเบื้อง -1 ในมิติของกระเบื้องนั้นซึ่งไม่ถูกต้องในกระเบื้องเป็นขนาดมิติ

แม่นยำยิ่งขึ้นถ้ามิติ i ของรูปร่างถูกกำจัดด้วยเครื่องหมายดอกจันในแผ่นกระเบื้องจากนั้นก่อนที่จะใช้คำจำกัดความก่อนหน้าของการปูกระเบื้องมิตินั้นจะถูกลบออกจากทั้งรูปร่างที่ถูกปูกระเบื้องและกระเบื้องเวกเตอร์และมิติ i-1 คืออะไร ของรูปร่างมีขอบเขตเพิ่มขึ้นจาก d i-1 เป็น d i d i-1 ขั้นตอนนี้ซ้ำสำหรับเครื่องหมายดอกจันแต่ละอันในเวกเตอร์ไทล์