Bố cục chia ô


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 ô gạch 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 các 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 các kích thước thực bằng ô 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 thành phần 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 phần tử khoảng đệm 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 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 giá trị cụ thể nào.

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

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

Số_chỉ_mục_tuyến_tính(e, d)
= chỉ_mục_tuyến_tính((en, en-1, ... , e1), (dn, dn-1, ... , d1))
= endn-1 d1 + en-2...d

Để đơn giản hoá việc ký hiệu trong tài liệu này, chúng tôi giả định 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 lát gạch của XLA, cách này được khái quát hoá thành lát gạch có ít kích thước hơn bằng cách giữ nguyên kích thước chính ban đầu và chỉ áp dụng lát gạch cho hầu hết các kích thước nhỏ nhất, để lát gạch được chỉ định có tính đến hậu tố của kích thước thực của hình dạng được xếp kề.

Khi xếp gạch có kích thước (tn, tn-1, ... , t1), một phần tử trong mảng có cá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:

.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/t 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, thì 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), cho vectơ toạ độ kết hợp là (1,1,0,1). Các chỉ mục thẻ thông tin 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). Sau đó, chỉ mục tuyến tính có ô cho phần tử có chỉ mục (2,3) trong hình dạng logic sẽ là

local_index_with_tile((2,3), (3,5), (2,2))
= Linear_index ((1,1,0,1), (2,3,2,2))
= Vi.

Lát gạch ở dạng chuyển đổi hình dạng như đệm

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

  1. Mảng này sẽ được đệm vào (⌈dn/tn⌉\rtn, ... , ⌈d1/t1⌉ GMBt1).
  2. Mỗi chiều i được chia thành (⌈di/ti⌉, ti), tức là mảng được đổi hình dạng thành
    (⌈dn/tn⌉, tn, ... , ⌈d1/t1⌉, t1).
    Không có sự thay đổi về bố cục thực tế trong hình dạng lại này, vì vậy, hình dạng này là một bitcast. Nếu bạn không nghĩ rõ ràng về hình xếp kề, thì hình dạng này có thể biểu thị bất kỳ hình dạng nào có 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 đến 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 nhất đến phụ trở thành
    (⌈dn/tn⌉, ... , ⌈d1/t1⌉, 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 từng nhóm. 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, ... , en mod tn, ... , e1 mod tn). 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 như dự kiến.

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

Việc lát gạch của XLA thậm chí trở nên linh hoạt hơn 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 xếp kề (đầu tiên là 2x4 rồi đến 2x1). Chúng tôi biểu diễn việc xếp kề lặp lại này là (2,4)(2,1). Mỗi màu biểu thị một thẻ thông tin 2x4 và mỗi ô đường viền màu đỏ là một thẻ thông tin 2x1. Những 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 phù hợp với định dạng dùng cho BF16 trên TPU, ngoại trừ ô ban đầu lớn hơn, cụ thể là ô vuông là (8,128)(2,1), trong đó mục đích của ô thứ hai là 2x1 để thu thậ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 trở lên có thể tham chiếu đến cả kích thước nhỏ bên 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 chính của thẻ thông tin từ ô xếp 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ụ: đối tượ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} vào F32[112,110]{1,0} trước khi xếp kề với (2,3). Ô được sử dụng là (MMS, 2, 2, 3). Ở đây, dấu hoa thị trong một thẻ thông tin có nghĩa là lấy kích thước đó và kết hợp với kích thước nhỏ tiếp theo. Nhiều chiều liền kề có thể được gộp lại với nhau thành một chiều. Phương diện được tổng hợp được biểu thị bằng giá trị thẻ thông tin -1 trong nhóm đó. Giá trị này không hợp lệ trong thẻ thông tin ở dạng kích thước kích thước phương diện.

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