Skip to content
版 本

Async

产 品 支 持 情 况

产 品是 否 支 持
Ascend 950PR/Ascend 950DT
Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品
Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品
Atlas 200I/500 A2 推 理 产 品
x
Atlas 推 理 系 列 产 品 AI Core
x
Atlas 推 理 系 列 产 品 Vector Core
x
Atlas 训 练 系 列 产 品
x

功 能 说 明

头 文 件 路 径 为:"basic_api/kernel_operator_utils_intf.h"

基 于分 离 模 式(AIC和AIV分 离)开 发 融 合 算 子 时,算 子 逻 辑 中 通 常 同 时 包 含AIV和AIC的 处 理 逻 辑,此 时 需 要 使 用Ascend C提 供 的 宏ASCEND_IS_AIV/ASCEND_IS_AIC实 现 如 下 硬 件 条 件 分 支 来 对AIV和AIC的 代 码 进 行 隔 离:

C++
if ASCEND_IS_AIV {
// AIV处 理 逻 辑
}
if ASCEND_IS_AIC {
// AIC处 理 逻 辑
}

Async通 过 模 板 函 数 的 方 式 对 这 种 隔 离 模 式 进 行 了 封 装,提 供 了 一 个 统 一 的 接 口,用 于 在 不 同 执 行 单 元(AIC或AIV)下 执 行 特 定 函 数,从 而 避 免 在 代 码 中 使 用 硬 件 条 件 分 支。

函 数 原 型

C++
template <EngineType engine, auto funPtr, class... Args>
__aicore__ void Async(Args... args)

参 数 说 明

表 1 模 板 参 数 说 明

参 数 名描 述
engineEngineType枚 举 类 型,可 取 值 如 下,对 应 不 同 的 硬 件 执 行 单 元:
• AIC
• AIV
funPtr函 数 指 针,指 定 要 执 行 的 函 数,函 数 签 名 和 参 数 类 型 由class... Args决 定。
class... Args可 变 参 数 模 板,表 示 函 数 参 数 的 类 型 列 表,用 于 传 递 给funPtr。

表 2 参 数 说 明

参 数 名输 入/输 出描 述
Args... args输 入与class... Args对 应 的 参 数 列 表,表 示 传 递 给funPtr的 实 际 参 数。

返 回 值 说 明

约 束 说 明

调 用 示 例

C++
__aicore__ inline void cubeProcess(KernelMmad &op, GM_ADDR A, GM_ADDR B, GM_ADDR c)
{
    op.InitAIC(A, B, c);
    op.ProcessAIC();
}
__aicore__ inline void vectorProcess(KernelMmad &op, GM_ADDR a, GM_ADDR b, GM_ADDR A, GM_ADDR B, GM_ADDR c)
{
    op.InitAIV(a, b, A, B, c);
    op.ProcessAIV();
}
__global__ __mix__(1,2) void mmad_custom(GM_ADDR a, GM_ADDR b, GM_ADDR A, GM_ADDR B, GM_ADDR c)
{
    AscendC::InitSocState();
    KernelMmad op;
    AscendC::Async<AscendC::EngineType::AIC, cubeProcess>(op, A, B, c);
    AscendC::Async<AscendC::EngineType::AIV, vectorProcess>(op, a, b, A, B, c);
}

免 责 声 明:本 站 内 容 由 asc-devkit 仓 master 分 支 自 动 编 译 生 成,属 于 持 续 开 发 版 本,可 能 存 在 缺 陷,仅 供 预 览 与 参 考。如 需 稳 定 及 商 用 资 料,请 查 阅 官 方 昇 腾 社 区