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