asc.language.adv.Matmul.get_tensor_c

Matmul.get_tensor_c(tensor: BaseTensor, en_atomic: int = 0, en_sequential_write: bool = False, sync: bool = True, optional_tensor: BaseTensor | None = None) None
Matmul.get_tensor_c(en_atomic: int = 0, en_sequential_write: bool = False, sync: bool = True) GlobalTensor

本接口和iterate接口配合使用,用于在调用iterate完成迭代计算后, 根据MatmulConfig参数中的ScheduleType取值获取一块或两块baseM * baseN大小的矩阵分片。

对应的Ascend C函数原型

template <bool sync = true>
__aicore__ inline void GetTensorC(const LocalTensor<DstT>& co2Local, uint8_t enAtomic = 0, bool enSequentialWrite = false)
template <bool sync = true>
__aicore__ inline void GetTensorC(const GlobalTensor<DstT>& gm, uint8_t enAtomic = 0, bool enSequentialWrite = false)
template <bool sync = true>
__aicore__ inline void GetTensorC(const GlobalTensor<DstT>& gm, const LocalTensor<DstT>& co2Local, uint8_t enAtomic = 0, bool enSequentialWrite = false)
template <bool sync = true>
__aicore__ inline GlobalTensor<DstT> GetTensorC(uint8_t enAtomic = 0, bool enSequentialWrite = false)

参数说明

  • tensor: 取出C矩阵到VECIN/GM。

  • en_atomic: 是否开启Atomic操作,默认值为0。

  • en_sequential_write: 是否开启连续写模式,默认值false。

  • sync: 设置同步或者异步模式。

  • optional_tensor: 取出C矩阵到VECIN,此参数使能时,tensor类型必须为GlobalTensor。

约束说明

  • 传入的C矩阵地址空间大小需要保证不小于base_m * base_n。

  • 异步场景时,需要使用一块临时空间来缓存iterate计算结果,调用get_tensor_c时会在该临时空间中获取C的矩阵分片。临时空间通过set_workspace接口进行设置。set_workspace接口需要在iterate接口之前调用。

  • 当使能MixDualMaster(双主模式)场景时,即模板参数enableMixDualMaster设置为true,不支持使用该接口。

调用示例

  • 获取C矩阵,输出至VECIN

    # 同步模式样例
    while mm.iterate() as count:
    mm.get_tensor_c(tensor=ub_cmatrix)
    # 异步模式样例
    mm.iterate(sync=False)
    # 其他操作
    for i in range(single_m // base_m * single_n // base_n):
        mm.get_tensor_c(tensor=ub_cmatrix, sync=False)
    
  • 获取C矩阵,输出至GM,同步模式样例

    while mm.iterate() as count:
        mm.get_tensor_c(tensor=gm)
    
  • 获取C矩阵,同时输出至GM和VECIN,同步模式样例

    while mm.iterate() as count:
        mm.get_tensor_c(tensor=gm, optional_tensor=ub_cmatrix)
    
  • 获取API接口返回的GM上的C矩阵,手动拷贝至UB,异步模式样例

    # base_m * base_n = 128 * 256
    mm.set_tensor_a(gm_a)
    mm.set_tensor_b(gm_b)
    mm.set_tail(single_m, single_n, single_k)
    mm.iterate(sync=False)
    for i in range(single_m // base_m * single_n // base_n):
        global = mm.get_tensor_c(sync=False)
        for j in range(4):
            local = que.alloc_tensor(dtype=asc.half)
            asc.data_copy(local, global[64* 128 * i:], count=64 * 128)