Skip to content
版 本

GetSystemCycle(ISASI)

产 品 支 持 情 况

产 品是 否 支 持
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_sys_var_intf.h"

获 取 系 统 计 数 器 当 前 的cycle值。通 过 计 算 代 码 段 前 后cycle值 的 差 值,可 得 到 代 码 段 消 耗 的 系 统cycle数,再 通 过 换 算 即 可 获 得 代 码 段 的 执 行 时 间。

针 对Ascend 950PR/Ascend 950DT,若 换 算 成 时 间 需 要 按 照1GHz的 频 率,时 间 单 位 为us,换 算 公 式 为:time = (cycle数/1000)us。

针 对Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,若 换 算 成 时 间 需 要 按 照50MHz的 频 率,时 间 单 位 为us,换 算 公 式 为:time = (cycle数/50)us。

针 对Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,若 换 算 成 时 间 需 要 按 照50MHz的 频 率,时 间 单 位 为us,换 算 公 式 为:time = (cycle数/50)us。

函 数 原 型

C++
__aicore__ inline int64_t GetSystemCycle()

参 数 说 明

返 回 值 说 明

返 回 系 统 计 数 器 当 前 的cycle值。

约 束 说 明

该 接 口 属 于PIPE_S流 水,若 需 要 测 试 其 他 流 水 的 指 令 时 间,需 要 在 调 用 该 接 口 前 通 过PipeBarrier插 入 对 应 流 水 的 同 步,具 体 请 参 考调 用 示 例

调 用 示 例

  • 如 下 示 例 通 过GetSystemCycle获 取 系 统cycle数,并 换 算 成 时 间(单 位:us)。

    C++
    #include "kernel_operator.h"
    
    __aicore__ inline void InitTilingParam(int32_t& totalSize, int32_t& loopSize)
    {
        int64_t systemCycleBefore = AscendC::GetSystemCycle(); // 调 用GetBlockNum指 令 前 的cycle数
        loopSize = totalSize / AscendC::GetBlockNum();
        int64_t systemCycleAfter = AscendC::GetSystemCycle(); // 调 用GetBlockNum指 令 后 的cycle数
        int64_t GetBlockNumCycle = systemCycleAfter - systemCycleBefore; // 执 行GetBlockNum指 令 所 用 的cycle数
        int64_t CycleToTimeBase = 50; // cycle数 转 换 成 时 间 的 基 准 单 位
        /* 在Ascend 950PR/Ascend 950DT上 为1000
        在Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 上 为50
        在Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 上 为50 */
        int64_t GetBlockNumTime = GetBlockNumCycle / CycleToTimeBase; // 执 行GetBlockNum指 令 所 用 时 间,单 位 为us
    };
    
  • 如 下 示 例 为 获 取 矢 量 计 算Add指 令 时 间 的 关 键 代 码 片 段,在 调 用GetSystemCycle之 前,插 入 了PIPE_ALL同 步,可 以 保 证 相 关 指 令 执 行 完 后 再 获 取cycle数。

    C++
    PipeBarrier<PIPE_ALL>();
    int64_t systemCycleBefore = AscendC::GetSystemCycle(); // 调 用Add指 令 前 的cycle数
    AscendC::Add(dstLocal, src0Local, src1Local, 512);
    PipeBarrier<PIPE_ALL>();
    int64_t systemCycleAfter = AscendC::GetSystemCycle(); // 调 用Add指 令 后 的cycle数
    int64_t GetBlockNumCycle = systemCycleAfter - systemCycleBefore; // 执 行Add指 令 所 用 的cycle数
    int64_t CycleToTimeBase = 50; // cycle数 转 换 成 时 间 的 基 准 单 位
    /* 在Ascend 950PR/Ascend 950DT上 为1000
    在Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 上 为50
    在Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 上 为50 */
    int64_t GetBlockNumTime = GetBlockNumCycle / CycleToTimeBase; // 执 行Add指 令 所 用 时 间,单 位 为us
    

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