Mã lỗi: E2003

Danh mục: Thời gian biên dịch: Mosaic Unproven Memory Access Alignment

Lỗi này xảy ra khi trình biên dịch phân tích một thao tác truy cập bộ nhớ (chẳng hạn như vector.load, vector.store, tpu.load hoặc tpu.store) và không thể chứng minh một cách tĩnh rằng chỉ mục động được dùng cho một phương diện cụ thể là bội số của kích thước phân ô bắt buộc.

Thông báo lỗi mẫu:

INTERNAL: Mosaic failed to compile TPU kernel: cannot statically prove that index in dimension 1 is a multiple of 128

at location: ...

The MLIR operation involved:
  %14372 = "vector.load"(%14371, %93, %14363) : (memref<4x256xf32, #tpu.memory_space<vmem>>, index, index) -> vector<1x32xf32>

XLA Backends: TPU

Tổng quan

Khi nhân tải hoặc lưu trữ một vectơ, địa chỉ bộ nhớ (được tính từ con trỏ cơ sở cộng với chỉ mục động) phải phù hợp với kích thước lát của vectơ trên phần cứng. Ví dụ: nếu một phương diện được chia thành 128 phần tử, thì chỉ mục động dùng để truy cập vào phương diện đó phải là 0, 128, 256, v.v. Xin lưu ý rằng nhiều thao tác (chẳng hạn như tải và lưu trữ vectơ) không có yêu cầu như vậy đối với chỉ mục tĩnh.

Trình biên dịch thực thi yêu cầu này bằng cách sử dụng phân tích tĩnh. Thao tác này theo dõi lịch sử của biến chỉ mục thông qua các phép toán số học đã tạo ra biến đó (ví dụ: phép nhân, phép cộng). Nếu trình biên dịch không thể đảm bảo (tại thời điểm biên dịch) rằng giá trị kết quả sẽ luôn chia hết cho kích thước lát, thì trình biên dịch sẽ đưa ra lỗi này.

Trình biên dịch xử lý "sai lệch đã được chứng minh" và "sai lệch không xác định" một cách giống nhau. Vì vậy, nếu bạn sử dụng một chỉ mục chắc chắn sẽ bị lệch về mặt toán học (ví dụ: i * 128 + 32), trình biên dịch sẽ đưa ra cùng một lỗi.

Vì vậy, lỗi này có thể xảy ra khi

  1. Bạn sử dụng một biến thời gian chạy (chỉ mục động) để truy cập vào bộ nhớ.
  2. Logic tính toán chỉ mục quá phức tạp để trình biên dịch phân tích.
  3. Chỉ mục này hợp lệ về mặt toán học nhưng thiếu bằng chứng rõ ràng trong mã.
  4. Phân tích tĩnh xác định "sự sai lệch đã được chứng minh".

Gỡ lỗi

Để giải quyết lỗi này, bạn có thể làm theo các cách sau:

1. Khẳng định sự liên kết một cách rõ ràng

Nếu bạn biết chỉ mục của mình hợp lệ nhưng trình biên dịch không chứng minh được điều đó, hãy sử dụng thao tác tpu.assume_multiple. Điều này đóng vai trò như một lời hứa với trình biên dịch rằng một giá trị có thể chia hết cho một hệ số cụ thể.

2. Sử dụng tính năng Tải và xoay theo hàng

Trong trường hợp bạn cố ý điều chỉnh sai, thay vì tải một đoạn vectơ nhỏ, không được điều chỉnh:

  • Tải một ô lớn hơn, được căn chỉnh hoàn toàn rồi xoay các giá trị theo một lượng động để chuyển dữ liệu mong muốn vào vị trí (vì không hỗ trợ các lát vectơ có chỉ mục bắt đầu động). hoặc
  • Định hình lại hoặc thêm khoảng đệm cho tensor để dữ liệu bắt đầu từ chỉ mục 0 và bước giữa các lần truy cập khớp với việc căn chỉnh phần cứng.
    • Ví dụ: Nếu bạn lặp lại các khối có kích thước 32 bắt đầu từ độ lệch 1, thì độ lệch của bạn sẽ là 1, 33, 65... (không thẳng hàng).
    • Khắc phục: Đóng gói lại dữ liệu thành một tensor mới, trong đó khối đầu tiên ở vị trí 0 và chiều được đệm thành 128. Các độ lệch của bạn sẽ là 0, 128, 256..., đáp ứng yêu cầu về việc căn chỉnh.

Các phương thức này tiêu tốn nhiều bộ nhớ hơn nhưng thường đơn giản hoá logic của nhân và loại bỏ nhu cầu về các xác nhận liên kết thủ công.