Tổng quan về toán tử gbmv
Toán tử gbmv (General Banded Matrix-Vector Multiplication) thực hiện phép nhân giữa ma trận dải (banded matrix) và vector. Đây là một trong những toán tử cốt lõi trong thư viện đại số tuyến tính cơ bản BLAS. Toán tử này được tối ưu hóa đặc biệt cho đặc tính lưu trữ thưa của ma trận dải, đồng thời hỗ trợ các phép toán chuyển vị và quy nạp song song trên nhiều nhân.
Sản phẩm hỗ trợ: Atlas A5 Training Series / Atlas A5 Inference Series.
Cấu trúc thư mục dự án
├── gbmv
│ ├── CMakeLists.txt // Tệp cấu hình biên dịch
│ ├── README.md // Tài liệu hướng dẫn
│ ├── gbmv_test.cpp // Bộ kiểm thử độ chính xác
│ ├── gbmv_perf_test.cpp // Bộ kiểm thử hiệu năng
│ └── gbmv_test_utils.h // Các hàm tiện ích kiểm thử
Mô tả chi tiết toán tử
Chức năng và biểu thức toán học
Toán tử gbmv tính toán phép nhân ma trận dải với vector theo biểu thức:
vec_out = scale_a * op(mat_banded) * vec_in + scale_b * vec_out
Trong đó: mat_banded là ma trận dải, vec_in và vec_out là các vector, scale_a và scale_b là các vô hướng, op(mat_banded) có thể là chính nó hoặc ma trận chuyển vị.
Ma trận dải được lưu trữ theo định dạng LAPACK, yêu cầu leading_dim_a * cols phần tử, với leading_dim_a >= lower_band + upper_band + 1. Phần tử mat_banded(i,j) được lưu tại vị trí upper_band + i - j + j * leading_dim_a, chỉ hợp lệ khi max(0, j-upper_band) <= i <= min(rows-1, j+lower_band).
Giao diện lập trình (API)
cannBlasStatus_t cannBlasBandedMatVecMul(
cannBlasContext_t ctx,
cannBlasOpType_t op_type,
int64_t rows,
int64_t cols,
int64_t lower_band,
int64_t upper_band,
const float *scale_a,
const float *mat_banded,
int64_t leading_dim_a,
const float *vec_in,
int64_t stride_in,
const float *scale_b,
float *vec_out,
int64_t stride_out);
Bảng mô tả tham số
| Tham số | Bộ nhớ | In/Out | Mô tả |
|---|---|---|---|
| ctx | - | in | Ngữ cảnh thư viện cannBlas. |
| op_type | - | in | Loại phép toán: CANNBLAS_OP_N (không chuyển vị), CANNBLAS_OP_T (chuyển vị), CANNBLAS_OP_C (chuyển vị liên hợp). |
| rows | - | in | Số hàng của ma trận. |
| cols | - | in | Số cột của ma trận. |
| lower_band | - | in | Băng thông dưới (số đường chéo khác không dưới đường chéo chính). |
| upper_band | - | in | Băng thông trên (số đường chéo khác không trên đường chéo chính). |
| scale_a | host/device | in | Vô hướng nhân với ma trận. |
| mat_banded | device | in | Mảng ma trận dải, kích thước leading_dim_a x cols. |
| leading_dim_a | - | in | Chiều dài chính của ma trận, >= lower_band + upper_band + 1. |
| vec_in | device | in | Vector đầu vào. |
| stride_in | - | in | Bước nhảy giữa các phần tử liên tiếp của vec_in. |
| scale_b | host/device | in | Vô hướng nhân với vec_out. |
| vec_out | device | in/out | Vector đầu ra. |
| stride_out | - | in | Bước nhảy giữa các phần tử liên tiếp của vec_out. |
Đặc tả toán tử
| Phân loại | Tên | Kích thước | Kiểu dữ liệu | Định dạng |
|---|---|---|---|---|
| Đầu vào | mat_banded | leading_dim_a * cols | float | ND |
| Đầu vào | vec_in | IN_COUNT | float | ND |
| Đầu vào | vec_out | OUT_COUNT | float | ND |
| Đầu vào | scale_a | 1 | float | ND |
| Đầu vào | scale_b | 1 | float | ND |
| Đầu ra | vec_out | OUT_COUNT | float | ND |
Hàm Kernel: banded_matvec_kernel
Luồng thực thi toán tử
Dữ liệu đầu vào được thu thập thành bộ nhớ liên tục thông qua GatherStrided ở phía Host, sau đó sao chép sang Device qua H2D. Kernel sẽ chia nhỏ các đoạn cột của ma trận và dữ liệu vector từ GM vào UB để thực hiện tính toán nhân và cộng. Kết quả được quy nạp song song đa nhân về vector đầu ra bằng cách sử dụng SetAtomicAdd. Cuối cùng, kết quả được ghi ngược về Host theo bước nhảy đầu ra thông qua ScatterStrided.
Gọi Kernel
Sử dụng cú pháp gọi kernel <<<>>> để thực thi hàm xử lý trên thiết bị.
banded_matvec_kernel<<<grid_size, block_size>>>(
rows, cols, lower_band, upper_band,
scale_a_val, mat_banded_dev, leading_dim_a,
vec_in_dev, stride_in,
scale_b_val, vec_out_dev, stride_out
);
Phạm vi kiểm thử
| Nhóm | Số lượng | Kịch bản kiểm thử |
|---|---|---|
| L0 op_type=N | 7 | Chức năng cơ bản, giá trị biên scale_a/scale_b, bước nhảy không đơn vị, ma trận hình chữ nhật. |
| L0 op_type=T/C | 7 | Chức năng chuyển vị cơ bản, scale_b=0, ma trận chữ nhật, chuyển vị liên hợp. |
| L1 op_type=N | 19 | Biến thể băng thông, hình dạng biên, bước nhảy âm, leading_dim_a không nén, quy mô lớn, đầu ra toàn 0. |
| L1 op_type=T/C | 18 | Biến thể băng thông chuyển vị, bước nhảy âm, ma trận chữ nhật lớn, đầu ra toàn 0. |
Biên dịch và thực thi
Thực hiện các bước sau tại thư mục gốc của dự án để biên dịch và chạy toán tử.
Cấu hình biến môi trường
Tùy thuộc vào cách cài đặt bộ công cụ CANN, chọn lệnh cấu hình phù hợp:
- Cài đặt mặc định cho người dùng root:
source /usr/local/Ascend/cann/set_env.sh - Cài đặt mặc định cho người dùng không phải root:
source $HOME/Ascend/cann/set_env.sh - Cài đặt tại đường dẫn tùy chỉnh
custom_install_path:source ${custom_install_path}/cann/set_env.sh
Chạy kiểm thử
Sử dụng script build để biên dịch và thực thi:
bash build.sh --ops=gbmv --run
Kết quả thành công sẽ hiển thị:
[PASS] gbmv_test