Bố cục theo ô


Hình 1

Hình 1 cho thấy cách một mảng F32 [3,5] được bố trí trong bộ nhớ với ô 2x2. Một hình dạng có bố cục này được viết là F32[3,5]{1,0:T(2,2)}, trong đó 1,0 liên quan đến thứ tự thực của kích thước (trường minor_to_major trong Bố cục) trong khi (2,2) sau dấu hai chấm biểu thị cách xếp ô kích thước thực bằng thẻ thông tin 2x2.

Theo trực quan, các thẻ thông tin được bố trí để bao phủ hình dạng, sau đó trong mỗi thẻ thông tin, các phần tử sau đó được bố trí mà không cần xếp kề, như trong ví dụ trên, trong đó phần bên phải của ví dụ hiển thị bố cục trong bộ nhớ, bao gồm cả các phần tử khoảng đệm màu trắng được thêm vào để có các thẻ thông tin 2x2 hoàn chỉnh mặc dù các giới hạn của mảng ban đầu không đồng đều.

Các phần tử bổ sung trong khoảng đệm không bắt buộc phải chứa bất kỳ giá trị cụ thể nào.

Công thức chỉ mục tuyến tính để lát gạch đã cho một hình dạng và một thẻ thông tin

Không xếp kề, phần tử e=(en, en-1, ... , e1) trong một mảng có giới hạn mảng là d=(dn, dn-1, ... , d1) (d1 là kích thước nhỏ nhất) được bố trí theo thứ tự lớn đến nhỏ tại vị trí:

tuyến_chỉ_mục(e, d)
= tuyến_chỉ_mục((en, en-1, ... , e1), (dn, dn-1, ... , d1))
= endn-1...d1 + en-1dn-1dn-1d

Để đơn giản hoá việc ký hiệu trong tài liệu này, chúng tôi giả định rằng một thẻ thông tin có cùng số lượng kích thước với mảng đó. Trong quá trình triển khai cách xếp ô của XLA, điều này được khái quát hoá thành các ô có ít kích thước hơn bằng cách giữ nguyên kích thước lớn nhất ban đầu và chỉ áp dụng ô cho hầu hết các kích thước nhỏ nhất, để ô được chỉ định có tính đến hậu tố của kích thước thực tế của hình dạng được xếp kề.

Khi sử dụng cách xếp kề kích thước (tn, tn-1, ... , t1), một phần tử trong mảng có chỉ mục (en, en-1, ... , e1) sẽ được ánh xạ tới vị trí này trong bố cục cuối cùng:

n ⌋ n⌋/t


n

Bố cục này có thể được coi là có hai phần: (⌊en/tn⌋, ... , ⌊e1/t1⌋), tương ứng với chỉ mục thẻ thông tin trong một mảng ô có kích thước (⌈dn/tn⌉, ... , ⌈d1/ Hàm ceil xuất hiện trong ⌈di/ti⌉ vì nếu thẻ thông tin vượt quá giới hạn của mảng lớn hơn, khoảng đệm sẽ được chèn như trong Hình 1. Cả thẻ thông tin và các phần tử trong thẻ thông tin đều được bố trí đệ quy mà không cần xếp kề.

Ví dụ trong Hình 1, phần tử (2,3) có chỉ mục ô (1,1) và chỉ mục trong ô (0,1), đối với vectơ toạ độ kết hợp là (1,1,0,1). Các chỉ mục thẻ thông tin có các giới hạn (2,3) và chính thẻ thông tin đó là (2,2) đối với một vectơ kết hợp của (2,3,2,2). Chỉ mục tuyến tính có ô cho phần tử có chỉ mục (2,3) trong hình dạng logic là





Lát gạch theo hình dạng pad, đổi hình dạng vành

Bố cục dạng ô hoạt động như sau:
Xem xét một mảng các kích thước (dn, dn-1, ... , d1) (d1 là kích thước nhỏ nhất). Khi được bố trí bằng ô lát có kích thước (tn, tn-1, ... , t1) (t1 là kích thước nhỏ nhất), bạn có thể mô tả ô lát đó theo cách hoán đổi hình dạng pad, như sau.

  1. Mảng được thêm vào (⌈dn/tn⌉ \ttn, ... , ⌈d1/t1⌉ Connectt1).
  2. Mỗi chiều i được chia thành (⌈di/ti⌉, ti), tức là mảng được định dạng lại thành
    (⌈dn/tn⌉, tn, ... , ⌈d1/t1⌉, t1).
    Không có thay đổi nào về bố cục thực tế trong việc đổi hình dạng lại này, vì vậy, hình dạng lại này là một bitcast. Nếu bạn không nghĩ rõ ràng đến thẻ thông tin, thì hình dạng này có thể biểu thị bất kỳ hình dạng nào với cùng số lượng phần tử như hình dạng có khoảng đệm – ví dụ ở đây là cách thể hiện thẻ thông tin theo cách này.
  3. Hoán vị xảy ra bằng cách di chuyển tn, ... , t1 sang các chiều nhỏ nhất trong khi vẫn giữ thứ tự tương đối để thứ tự các chiều từ lớn đến nhỏ trở thành
    (⌈dn/tn⌉, ... , ⌈d1/t1⌉, ... tn, tn,

Hình dạng cuối cùng có tiền tố
(⌈dn/tn⌉, ... , ⌈d1/t1⌉), mô tả số lượng thẻ thông tin trong mỗi phương diện. Một phần tử trong mảng (en, ... , e1) được ánh xạ tới phần tử này trong hình dạng cuối cùng:
(⌊en/tn⌋, ... , ⌊e0/t0⌋, en mod tn, ... , e1 mod tn, ... , e1 mod tn, ... , e1 mod). Bạn có thể dễ dàng thấy rằng chỉ mục tuyến tính của phần tử tuân theo công thức ở trên đúng như dự kiến.

Lát gạch lặp lại

Việc lát gạch của XLA trở nên linh hoạt hơn nữa bằng cách áp dụng nhiều lần.


Hình 2

Hình 2 cho thấy cách một mảng có kích thước 4x8 được xếp kề theo hai cấp lát (đầu tiên là 2x4 rồi đến 2x1). Chúng ta biểu diễn cách lặp lại này là (2,4)(2,1). Mỗi màu biểu thị một thẻ thông tin có kích thước 2x4 và mỗi ô có đường viền màu đỏ là một thẻ thông tin có kích thước 2x1. Các con số cho biết chỉ mục tuyến tính trong bộ nhớ của phần tử đó ở định dạng xếp kề. Định dạng này khớp với định dạng dùng cho BF16 trên TPU, ngoại trừ thẻ thông tin ban đầu lớn hơn, cụ thể là thẻ thông tin là (8,128)(2,1), trong đó mục đích của cách xếp kề thứ hai 2x1 là tập hợp hai giá trị 16 bit để tạo thành một giá trị 32 bit theo cách phù hợp với kiến trúc của TPU.

Lưu ý rằng thẻ thông tin thứ hai hoặc sau đó có thể tham chiếu đến cả kích thước nhỏ trong thẻ thông tin, chỉ sắp xếp lại dữ liệu trong thẻ thông tin, như trong ví dụ này với (8,128)(2,1), nhưng cũng có thể tham chiếu đến các kích thước thẻ thông tin chính từ ô trước.

Kết hợp các phương diện bằng ô

Lát gạch của XLA cũng hỗ trợ kết hợp các kích thước. Ví dụ: ứng dụng này có thể kết hợp các kích thước trong F32[2,7,8,11,10]{4,3,2,1,0} thành F32[112,110]{1,0} trước khi xếp kề với (2,3). Thẻ thông tin được sử dụng là (*), *), 2, \, 3. Ở đây, dấu hoa thị trong một thẻ thông tin ngụ ý việc lấy phương diện đó và kết hợp với một phương diện nhỏ tiếp theo. Nhiều chiều liền kề có thể được cộng lại thành một chiều. Thứ nguyên được biểu thị bằng giá trị của thẻ thông tin là -1 trong phương diện đó. Giá trị này sẽ không hợp lệ trong thẻ thông tin dưới dạng kích thước kích thước.

Chính xác hơn, nếu kích thước i của hình dạng bị loại bỏ qua dấu hoa thị trong thẻ thông tin, thì trước khi áp dụng định nghĩa trước đó về xếp kề, kích thước đó sẽ bị xoá khỏi cả hình dạng ô và vectơ xếp kề, còn chiều i-1 của hình dạng có liên kết mảng tăng từ di-1 lên didi-1. Bước này lặp lại cho từng dấu hoa thị trong vectơ xếp kề.