Async
产品支持情况
功能说明
Async提供了一个统一的接口,用于在不同模式下(AIC或AIV)执行特定函数,从而避免代码中直接的硬件条件判断(如使用ASCEND_IS_AIV或ASCEND_IS_AIC)。
函数原型
template <EngineType engine, auto funPtr, class... Args>
__aicore__ void Async(Args... args)
参数说明
表 1 模板参数说明
enum class EngineType : int32_t {
AIC = 1, // 仅AIC
AIV = 2 // 仅AIV
};
|
|
表 2 参数说明
返回值说明
无
约束说明
无
调用示例
extern "C" __global__ __aicore__ void baremix_custom(GM_ADDR a, GM_ADDR b, GM_ADDR bias, GM_ADDR c,
GM_ADDR workspace, GM_ADDR tilingGm)
{
KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_MIX_AIC_1_2);
AscendC::TPipe pipe;
TCubeTiling tiling;
CopyTiling(&tiling, tilingGm);
// 避免代码中直接的硬件条件判断(如使用ASCEND_IS_AIV或ASCEND_IS_AIC)
Async<EngineType::AIC, aicOperation>(a, b, bias, c, workspace, tiling, &pipe);
Async<EngineType::AIV, aivOperation>(c, tiling, &pipe);
}
__aicore__ inline void aicOperation(GM_ADDR a, GM_ADDR b, GM_ADDR bias, GM_ADDR c, GM_ADDR workspace, const TCubeTiling &tiling, AscendC::TPipe *pipe) {
MatmulLeakyKernel<half, half, float, float> matmulLeakyKernel;
matmulLeakyKernel.Init(a, b, bias, c, workspace, tiling, pipe);
REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), matmulLeakyKernel.matmulObj, &matmulLeakyKernel.tiling);
matmulLeakyKernel.Process(pipe);
}
__aicore__ inline void aivOperation(GM_ADDR c, const TCubeTiling &tiling, AscendC::TPipe *pipe) {
LeakyReluKernel<float> leakyReluKernel;
leakyReluKernel.Init(c, tiling, pipe);
leakyReluKernel.Process(pipe);
}