CBLAS接口(blas)
总体说明
- 调用本章节接口实现“矩阵-矩阵”或“矩阵-向量”相乘的运算,本章中的接口内部封装了系统内置的矩阵乘算子GEMM,接口调用流程参见接口调用流程。
按照接口调用流程,在使用本章节的接口前,需要先使用ATC(Ascend Tensor Compiler)工具将内置的矩阵乘算子GEMM的算子描述信息(包括输入输出Tensor描述、算子属性等)编译成适配AI处理器的离线模型(*.om文件),用于验证矩阵乘算子GEMM的运行结果。
- 本章的CBLAS接口都是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功。调用该接口后,需调用同步等待接口(例如,acl.rt.synchronize_stream)确保任务已执行完成。
关于A、B、C矩阵的Shape及内存大小计算公式
- A、B、C矩阵是否转置的标记如果设置为ACL_TRANS_N或ACL_TRANS_T,则用户在申请内存存放A、B、C矩阵数据时,实际申请的内存要和实际数据大小匹配,Shape及内存大小的计算公式如下:
- A矩阵:shape = (m, k);内存大小 = m * k * acl.data_type_size(data_type_a)
- B矩阵:shape = (k, n);内存大小 = k * n * acl.data_type_size(data_type_b)
- C矩阵:shape = (m, n);内存大小 = m * n * acl.data_type_size(data_type_c)
- A、B、C矩阵是否转置的标记如果设置为ACL_TRANS_NZ,表示采用内部数据格式,矩阵Shape为4维,Shape及内存大小的计算公式如下(假设m,k,n分别为原始轴):
- 当矩阵A和矩阵B中数据的类型为aclFloat16,在计算实际内存大小时,m、k、n均按16对齐向上取整计算:
- A矩阵:shape = (⌈k/16⌉, ⌈m/16⌉, 16, 16);内存大小 = ⌈m/16⌉ * 16 * ⌈k/16⌉ * 16 * acl.data_type_size(data_type_a)
- B矩阵:shape = (⌈n/16⌉, ⌈k/16⌉, 16, 16);内存大小 = ⌈k/16⌉ * 16 * ⌈n/16⌉ * 16 * acl.data_type_size(data_type_b)
- C矩阵:shape = (⌈n/16⌉, ⌈m/16⌉, 16, 16);内存大小 = ⌈m/16⌉ * 16 * ⌈n/16⌉ * 16 * acl.data_type_size(data_type_c)
- 当矩阵A和矩阵B中数据的类型为int8_t,在计算实际内存大小时,reduce轴按32对齐向上取整计算,非reduce轴按16对齐向上取整计算:
- A矩阵:shape = (⌈k/32⌉, ⌈m/16⌉, 16, 32);内存大小 = ⌈m/16⌉ * 16 * ⌈k/32⌉ * 32 * acl.data_type_size(data_type_a)
- B矩阵:shape = (⌈k/32⌉, ⌈n/16⌉, 32, 16);内存大小 = ⌈k/32⌉ * 32 * ⌈n/16⌉ * 16 * acl.data_type_size(data_type_b)
- C矩阵:shape = (⌈n/16⌉, ⌈m/16⌉, 16, 16);内存大小 = ⌈m/16⌉ * 16 * ⌈n/16⌉ * 16 * acl.data_type_size(data_type_c)
⌈ ⌉表示向上对齐。
- 当矩阵A和矩阵B中数据的类型为aclFloat16,在计算实际内存大小时,m、k、n均按16对齐向上取整计算: