Lệnh TAND là một phần của tập lệnh ảo PTO (Parallel Tile Operation) được phát triển bởi Ascend CANN. Lệnh này thực hiện phép toán logic AND trên từng phần tử (elementwise) giữa hai khối dữ liệu (tile).
Nguyên lý toán học
Đối với mỗi phần tử tại vị trí (i, j) trong vùng dữ liệu hợp lệ, kết quả được tính toán như sau:
dst[i, j] = src0[i, j] & src1[i, j]
Cú pháp Assembly
Tùy theo cấp độ trừu tượng, lệnh TAND được biểu diễn qua các dạng sau:
Dạng đồng bộ (Synchronous form)
%res_tile = tand %input_a, %input_b : !pto.tile<...>
Dạng SSA (Cấp độ AS Level 1)
%res_tile = pto.tand %input_a, %input_b : (!pto.tile<...>, !pto.tile<...>) -> !pto.tile<...>
Dạng DPS (Cấp độ AS Level 2)
pto.tand ins(%input_a, %input_b : !pto.tile_buf<...>, !pto.tile_buf<...>) outs(%res_tile : !pto.tile_buf<...>)
C++ Intrinsic
Hàm nội tại được khai báo trong tệp tiêu đề include/pto/common/pto_instr.hpp:
template <typename TileDataType, typename... EventList>
PTO_INST RecordEvent TAND(TileDataType &dst, TileDataType &src0, TileDataType &src1, EventList &... events);
Các ràng buộc kỹ thuật
- Phiên bản phần cứng A2/A3:
- Hỗ trợ các kiểu dữ liệu số nguyên có kích thước 1-byte hoặc 2-byte.
- Tất cả các tile (đích và nguồn) phải có cùng kiểu dữ liệu.
- Dữ liệu phải được sắp xếp theo định dạng hàng-ưu-tiên (row-major).
- Kích thước vùng hợp lệ (Valid Row/Col) của các tile đầu vào phải khớp với tile đích.
- Phiên bản phần cứng A5:
- Hỗ trợ mở rộng các kiểu dữ liệu số nguyên 1-byte, 2-byte hoặc 4-byte.
- Yêu cầu về định dạng hàng-ưu-tiên và tính nhất quán về kích thước tương tự như A2/A3.
- Vùng lặp: Toán tử sử dụng kích thước
dst.GetValidRow()vàdst.GetValidCol()để xác định phạm vi xử lý.
Ví dụ minh họa
Sử dụng C++ API
#include <pto/pto-inst.hpp>
using namespace pto;
void performBitwiseAnd() {
// Định nghĩa Tile với kiểu int32_t, kích thước 16x16
using MyTile = Tile<TileType::Vec, int32_t, 16, 16>;
MyTile tileA, tileB, tileResult;
// Thực hiện lệnh TAND
TAND(tileResult, tileA, tileB);
}
Sử dụng Assembly (Chế độ thủ công)
Trong chế độ thủ công, tài nguyên cần được gán nhãn rõ ràng trước khi thực thi lệnh:
# Gán địa chỉ bộ nhớ cho các tham số
# pto.tassign %arg0, @tile(0x1000)
# pto.tassign %arg1, @tile(0x2000)
%dst = pto.tand %src0, %src1 : (!pto.tile<...>, !pto.tile<...>) -> !pto.tile<...>