CheckLocalMemoryIA(ISASI)
产 品 支 持 情 况
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_common_intf.h"。 check设 定 范 围 内 的UB读 写 行 为,如 果 有 设 定 范 围 的 读 写 行 为 则 会 出 现EXCEPTION报 错,无 设 定 范 围 的 读 写 行 为 则 不 会 报 错。
函 数 原 型
C++
__aicore__ inline void CheckLocalMemoryIA(const CheckLocalMemoryIAParam& checkParams)
参 数 说 明
表 1 参 数 说 明
| 参 数 名 称 | 输 入/输 出 | 描 述 |
|---|---|---|
| checkParams | 输 入 | 用 于 配 置 对UB访 问 的 检 查 行 为,类 型 为CheckLocalMemoryIAParam。 具 体 定 义 请 参 考 ${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请 替 换 为CANN软 件 安 装 后 文 件 存 储 路 径。参 数 说 明 请 参 考表2。 |
表 2 CheckLocalMemoryIAParam结 构 体 内 参 数 说 明
| 参 数 名 称 | 含 义 |
|---|---|
| enableBit | 配 置 的 异 常 寄 存 器,取 值 范 围:enableBit∈[0,3],默 认 为0。 • 0:异 常 寄 存 器0。 • 1:异 常 寄 存 器1。 • 2:异 常 寄 存 器2。 • 3:异 常 寄 存 器3。 |
| startAddr | Check的 起 始 地 址,32B对 齐,取 值 范 围:startAddr∈[0, 65535],默 认 值 为0。比 如,可 通 过LocalTensor.GetPhyAddr()/32来 获 取startAddr。 |
| endAddr | Check的 结 束 地 址,32B对 齐,取 值 范 围:endAddr∈[0, 65535]。默 认 值 为0。 |
| isScalarRead | Check标 量 读 访 问。 •false:不 开 启,默 认 为false。 •true:开 启。 |
| isScalarWrite | Check标 量 写 访 问。 •false:不 开 启,默 认 为false。 •true:开 启。 |
| isVectorRead | Check矢 量 读 访 问。 •false:不 开 启,默 认 为false。 •true:开 启。 |
| isVectorWrite | Check矢 量 写 访 问。 •false:不 开 启,默 认 为false。 •true:开 启。 |
| isMteRead | Check MTE读 访 问。 •false:不 开 启,默 认 为false。 •true:开 启。 |
| isMteWrite | Check MTE写 访 问。 •false:不 开 启,默 认 为false。 •true:开 启。 |
| isEnable | 是 否 使 能enableBit参 数 配 置 的 异 常 寄 存 器。 •false:不 使 能,默 认 为false。 •true:使 能。 |
| reserved | 预 留 参 数。为 后 续 的 功 能 做 保 留,开 发 者 暂 时 无 需 关 注,使 用 默 认 值 即 可。 |
约 束 说 明
- startAddr/endAddr的 单 位 是32B,check的 范 围 不 包 含startAddr,包 含endAddr,即(startAddr,endAddr]。
- 每 次 调 用 完 该 接 口 需 要 进 行 复 位(配 置isEnable为false进 行 复 位)。
- 操 作 数 地 址 对 齐 要 求 请 参 见通 用 地 址 对 齐 约 束。
调 用 示 例
该 示 例check矢 量 写 访 问 是 否 在 设 定 的(startAddr, endAddr]范 围 内。当 前 示 例check到 矢 量 写 在 设 定 的 范 围 内,结 果 会 报 错(ACL_ERROR_RT_VECTOR_CORE_EXCEPTION)。
C++
AscendC::TPipe pipe;
AscendC::TQue<AscendC::TPosition::VECIN, 1> inQueueSrc0, inQueueSrc1;
AscendC::TQue<AscendC::TPosition::VECOUT, 1> outQueueDst;
pipe.InitBuffer(inQueueSrc0, 1, 512 * sizeof(half));
pipe.InitBuffer(inQueueSrc1, 1, 512 * sizeof(half));
pipe.InitBuffer(outQueueDst, 1, 512 * sizeof(half));
AscendC::LocalTensor<half> src0Local = inQueueSrc0.DeQue<half>();
AscendC::LocalTensor<half> src1Local = inQueueSrc1.DeQue<half>();
AscendC::LocalTensor<half> dstLocal = outQueueDst.AllocTensor<half>();
AscendC::CheckLocalMemoryIA({ 0, (uint32_t)(dstLocal.GetPhyAddr() / 32),(uint32_t)((dstLocal.GetPhyAddr() + 512 * sizeof(half)) / 32), false, false, false, true, false, false,
true });