Trang này được dịch bởi Cloud Translation API.
Switch to English

Bố trí lát gạch

Hình 1

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

Các ô trực quan được đặt ra để che hình dạng và sau đó trong mỗi ô, các phần tử sau đó được bố trí mà không ốp, 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ử đệm trắng được thêm vào để có các ô 2x2 hoàn chỉnh mặc dù các giới hạn mảng ban đầu không đồng đều.

Các yếu tố bổ sung trong phần đệ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ỉ số tuyến tính để ốp lát cho một hình dạng và hình xếp

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

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

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

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

linear_index_with_tile (e, d, t)
= linear_index ((e / t⌋, e mod t), (⌈d / t⌉, t)) (số học là nguyên tố, (a, b) là ghép)
= linear_index ((e n / t n , ..., e 1 / t 1 , e n mod t n , ..., e 1 mod t 1 ), (⌈d n / t n , ..., 1d 1 / t 1 , t n , t n-1 , ..., t 1 ))
= linear_index ((e n / t n , ..., e 1 / t 1 ⌋), (⌈d n / t n ⌉, ..., ⌈d 1 / t 1 ⌉)) ∙ t n t n-1 ... t 1 + linear_index ((e n mod t n , ..., e 1 mod t 1 ), (t n , t n-1 , ..., t 1 ))

Bố cục có thể được coi là có hai phần: (⌊e n / t n , ..., ⌊e 1 / t 1 ⌋), tương ứng với một chỉ số ô vuông trong một mảng các ô có kích thước (⌈d n / t n , ..., ⌈d 1 / t 1 ⌉) và (e n mod t n , ..., e 1 mod t 1 ), tương ứng với chỉ số trong ô. Hàm trần xuất hiện trong ⌈d i / t i ⌉ vì nếu gạch vượt quá giới hạn của mảng lớn hơn, phần đệm được chèn như trong Hình 1. Cả gạch và các phần tử trong gạch được đặt đệ quy mà không ốp.

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

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.

Ốp lát như pad-reshape-transpose

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

  1. Mảng được đệm vào (⌈d n / t n ⌉ t n , ..., ⌈d 1 / t 1 ⌉ t 1 ).
  2. Mỗi kích thước i được chia thành (⌈d i / t i ⌉, t i ), tức là mảng được định hình lại thành
    (⌈D n / t n , t n , ..., ⌈d 1 / t 1 , t 1 ).
    Không có thay đổi bố cục vật lý trong bản định hình lại này, vì vậy bản định hình lại này là một bitcast. Nếu một người không nghĩ rõ ràng về ốp lát, việc định hình lại 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ử với hình dạng đệm - ví dụ ở đây là về cách thể hiện một ô theo cách này.
  3. Một chuyển vị xảy ra bằng cách di chuyển t n , ..., t 1 sang các kích thước nhỏ nhất trong khi vẫn giữ trật tự tương đối của chúng, để thứ tự các kích thước từ lớn nhất đến hầu hết nhỏ trở thành
    (⌈D n / t n , ..., ⌈d 1 / t 1 , t n , ..., t 1 ).

Hình dạng cuối cùng có tiền tố
(⌈D n / t n , ..., ⌈d 1 / t 1 ⌉), mô tả số lượng gạch trong mỗi chiều. Một phần tử trong mảng (e n , ..., e 1 ) được ánh xạ tới phần tử này trong hình dạng cuối cùng:
(Ne n / t n , ..., e 0 / t 0 , e n mod t n , ..., e 1 mod t 1 ). Dễ dàng thấy rằng chỉ số tuyến tính của phần tử tuân theo công thức trên như mong đợi.

Ốp lát lặp đi lặp lại

Ốp lát của XLA thậm chí còn linh hoạt hơn bằng cách áp dụng nó nhiều lần.

Hình 2

Hình 2 cho thấy một mảng có kích thước 4x8 được xếp theo hai mức độ lát gạch (đầu tiên là 2x4 sau đó là 2x1). Chúng tôi đại diện cho điều này lặp đi lặp lại như (2,4) (2.1). Mỗi màu biểu thị một ô 2x4 và mỗi ô viền màu đỏ là một ô 2x1. Các con số chỉ ra chỉ số tuyến tính trong bộ nhớ của phần tử đó ở định dạng lát gạch. Định dạng này phù hợp với định dạng được sử dụng cho BF16 trên TPU, ngoại trừ ô ban đầu lớn hơn, cụ thể là ốp lát là (8,128) (2,1), trong đó mục đích của lát thứ hai bởi 2x1 là để thu thập hai giá trị 16 bit với nhau 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 lát thứ hai trở lên có thể tham chiếu đến cả kích thước nhỏ trong ô, chỉ sắp xếp lại dữ liệu trong ô, như trong ví dụ này với (8,128) (2,1), nhưng cũng có thể đề cập đến ô chéo chính kích thước từ ốp lát trước.

Kết hợp kích thước bằng gạch

Ốp lát của XLA cũng hỗ trợ kết hợp kích thước. Ví dụ: nó 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 ốp nó với (2,3 ). Ngói được sử dụng là (∗, ∗, 2, ∗, 3). Ở đây một dấu sao trong một ô ngụ ý lấy kích thước đó và kết hợp nó với kích thước nhỏ hơn tiếp theo. Nhiều kích thước liền kề có thể được gộp lại thành một chiều. Kích thước được thu nhỏ được biểu thị bằng giá trị ô -1 trong kích thước đó của ô, không có giá trị khác trong ô dưới dạng kích thước.

Chính xác hơn, nếu kích thước i của hình được loại bỏ thông qua dấu hoa thị trong ô, thì trước khi định nghĩa lát gạch trước được áp dụng, kích thước đó được loại bỏ khỏi cả hình dạng được lát và vectơ gạch, và kích thước i-1 là gì của hình có ràng buộc mảng tăng từ d i-1 đến d i d i-1 . Bước này được lặp lại cho mỗi dấu hoa thị trong vector gạch.