SetSysWorkSpace
产 品 支 持 情 况
功 能 说 明
框 架 需 要 使 用 的workspace称 之 为 系 统workspace。Matmul Kernel侧 接 口等 高 阶API需 要 系 统workspace,所 以 在 使 用 该 类API时,需 要 调 用 该 接 口,设 置 系 统workspace的 指 针。采 用 工 程 化 算 子 开 发 方 式 或 者kernel直 调 方 式(开 启HAVE_WORKSPACE编 译 选 项)时,不 需 要 开 发 者 手 动 设 置,框 架 会 自 动 设 置。其 他 场 景 下,需 要 开 发 者 调 用SetSysWorkSpace进 行 设 置。
在kernel侧 调 用 该 接 口 前,需 要 在host侧 调 用GetLibApiWorkSpaceSize获 取 系 统workspace的 大 小,并 在host侧 设 置workspacesize大 小。样 例 如 下:
Text
// 用 户 自 定 义 的tiling函 数
static ge::graphStatus TilingFunc(gert::TilingContext* context)
{
AddApiTiling tiling;
...
size_t usrSize = 256; // 设 置 用 户 需 要 使 用 的workspace大 小。
// 如 需 要 使 用 系 统workspace需 要 调 用GetLibApiWorkSpaceSize获 取 系 统workspace的 大 小。
auto ascendcPlatform = platform_ascendc:: PlatformAscendC(context->GetPlatformInfo());
uint32_t sysWorkspaceSize = ascendcPlatform.GetLibApiWorkSpaceSize();
size_t *currentWorkspace = context->GetWorkspaceSizes(1); // 通 过 框 架 获 取workspace的 指 针,GetWorkspaceSizes入 参 为 所 需workspace的 块 数。当 前 限 制 使 用 一 块。
currentWorkspace[0] = usrSize + sysWorkspaceSize; // 设 置 总 的workspace的 数 值 大 小,总 的workspace空 间 由 框 架 来 申 请 并 管 理。
...
}
函 数 原 型
Text
__aicore__ inline void SetSysWorkspace(GM_ADDR workspace)
参 数 说 明
表 1 接 口 参 数 说 明
核 函 数 传 入 的workspace的 指 针,包 括 系 统workspace和 用 户 使 用 的workspace。 |
约 束 说 明
无
返 回 值 说 明
无
调 用 示 例
Text
template<typename aType, typename bType, typename cType, typename biasType>
__aicore__ inline void MatmulLeakyKernel<aType, bType, cType, biasType>::Init(
GM_ADDR a, GM_ADDR b, GM_ADDR bias, GM_ADDR c, GM_ADDR workspace, const TCubeTiling& tiling, float alpha)
{
// 融 合 算 子 的 初 始 化 操 作
// ...
// workspace为 核 函 数 传 入 的GM指 针,用 于 设 置 系 统workspace
AscendC::SetSysWorkspace(workspace);
if (GetSysWorkSpacePtr() == nullptr) {
return;
}
// 后 续Matmul指 令
...
}