Skip to content
版 本

asc_storealign

产 品 支 持 情 况

产 品是 否 支 持
Ascend 950PR/Ascend 950DT

功 能 说 明

reg计 算 数 据 搬 运 接 口,适 用 于 从 矢 量 数 据 寄 存 器 或 掩 码 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景,并 支 持 多 种 搬 出 模 式,接 口 通 过 地 址 寄 存 器 传 入 偏 移,用 户 可 以 选 择 更 新 偏 移 或 者 更 新 目 的 操 作 数 的 地 址。

  • 从 矢 量 数 据 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景
    • NORM搬 出 模 式:正 常 模 式,搬 运VL数 据,支 持 数 据 类 型 为b8、b16、b32。
    • FIRST搬 出 模 式:忽 略mask,向dst_align32b中 搬 运src第 一 个 元 素,支 持 数 据 类 型 为b8、b16、b32。
    • PACK搬 出 模 式:压 缩 模 式,根 据mask将src中 有 效 元 素 的 低 半 部 分bit数 据 连 续 存 储 于dst_align32b中,支 持 数 据 类 型 为b16、b32、b64。
    • PACKV2搬 出 模 式:压 缩 模 式,根 据mask将src中 有 效 元 素 的 低8bits数 据 连 续 存 储 于dst_align32b中,支 持 数 据 类 型 为b32。
    • INTLV搬 出 模 式:双 搬 出 模 式,忽 略mask,将src0,src1中 的 元 素 交 错 存 储 于dst中,存 储 长 度 为VL*2。
  • 从 掩 码 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景
    • NORM搬 出 模 式:正 常 模 式,搬 运VL数 据,支 持 数 据 类 型 为u8、u16、u32。
    • PACK搬 出 模 式:压 缩 模 式,将src中 元 素 的 低 半 部 分bit数 据 连 续 存 储 于dst中,支 持 数 据 类 型 为u8、u16、u32。

函 数 原 型

  • 从 矢 量 数 据 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景
    C++
    // NORM搬 出 模 式
    __simd_callee__ inline void asc_storealign(__ubuf__  int8_t* dst_align32b, vector_int8_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  uint8_t* dst_align32b, vector_uint8_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  int16_t* dst_align32b, vector_int16_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  uint16_t* dst_align32b, vector_uint16_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  int32_t* dst_align32b, vector_int32_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  uint32_t* dst_align32b, vector_uint32_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  half* dst_align32b, vector_half src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  float* dst_align32b, vector_float src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  bfloat16_t* dst_align32b, vector_bfloat16_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  fp8_e4m3fn_t* dst_align32b, vector_fp8_e4m3fn_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  hifloat8_t* dst_align32b, vector_hifloat8_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  fp8_e5m2_t* dst_align32b, vector_fp8_e5m2_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  fp8_e8m0_t* dst_align32b, vector_fp8_e8m0_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  fp4x2_e2m1_t* dst_align32b, vector_fp4x2_e2m1_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  fp4x2_e1m2_t* dst_align32b, vector_fp4x2_e1m2_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign(__ubuf__  int4b_t* dst_align32b, vector_int4x2_t src, iter_reg offset, vector_bool mask)
    
    // FIRST搬 出 模 式
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  int8_t* dst_align32b, vector_int8_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  uint8_t* dst_align32b, vector_uint8_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  int16_t* dst_align32b, vector_int16_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  uint16_t* dst_align32b, vector_uint16_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  int32_t* dst_align32b, vector_int32_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  uint32_t* dst_align32b, vector_uint32_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  half* dst_align32b, vector_half src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  float* dst_align32b, vector_float src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  bfloat16_t* dst_align32b, vector_bfloat16_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  fp8_e4m3fn_t* dst_align32b, vector_fp8_e4m3fn_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  hifloat8_t* dst_align32b, vector_hifloat8_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  fp8_e5m2_t* dst_align32b, vector_fp8_e5m2_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  fp8_e8m0_t* dst_align32b, vector_fp8_e8m0_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  fp4x2_e2m1_t* dst_align32b, vector_fp4x2_e2m1_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  fp4x2_e1m2_t* dst_align32b, vector_fp4x2_e1m2_t src, iter_reg offset)
    __simd_callee__ inline void asc_storealign_1st(__ubuf__  int4b_t* dst_align32b, vector_int4x2_t src, iter_reg offset)
    
    // PACK搬 出 模 式
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  int16_t* dst_align32b, vector_int16_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  uint16_t* dst_align32b, vector_uint16_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  int32_t* dst_align32b, vector_int32_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  uint32_t* dst_align32b, vector_uint32_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  int64_t* dst_align32b, vector_int64_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  uint64_t* dst_align32b, vector_uint64_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  half* dst_align32b, vector_half src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  float* dst_align32b, vector_float src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__  bfloat16_t* dst_align32b, vector_bfloat16_t src, iter_reg offset, vector_bool mask)
    
    // PACKV2搬 出 模 式
    __simd_callee__ inline void asc_storealign_pack_v2(__ubuf__  int32_t* dst_align32b, vector_int32_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack_v2(__ubuf__  uint32_t* dst_align32b, vector_uint32_t src, iter_reg offset, vector_bool mask)
    __simd_callee__ inline void asc_storealign_pack_v2(__ubuf__  float* dst_align32b, vector_float src, iter_reg offset, vector_bool mask)
    
    // INTLV搬 出 模 式
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  int8_t* dst_align32b, vector_int8_t src0, vector_int8_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  uint8_t* dst_align32b, vector_uint8_t src0, vector_uint8_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  int16_t* dst_align32b, vector_int16_t src0, vector_int16_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  uint16_t* dst_align32b, vector_uint16_t src0, vector_uint16_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  int32_t* dst_align32b, vector_int32_t src0, vector_int32_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  uint32_t* dst_align32b, vector_uint32_t src0, vector_uint32_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  half* dst_align32b, vector_half src0, vector_half src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  bfloat16_t* dst_align32b, vector_bfloat16_t src0, vector_bfloat16_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  fp8_e4m3fn_t* dst_align32b, vector_fp8_e4m3fn_t src0, vector_fp8_e4m3fn_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  hifloat8_t* dst_align32b, vector_hifloat8_t src0, vector_hifloat8_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  fp8_e5m2_t* dst_align32b, vector_fp8_e5m2_t src0, vector_fp8_e5m2_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  fp8_e8m0_t* dst_align32b, vector_fp8_e8m0_t src0, vector_fp8_e8m0_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  fp4x2_e2m1_t* dst_align32b, vector_fp4x2_e2m1_t src0, vector_fp4x2_e2m1_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  fp4x2_e1m2_t* dst_align32b, vector_fp4x2_e1m2_t src0, vector_fp4x2_e1m2_t src1, iter_reg offset)
    __simd_callee__ inline void asc_storealign_intlv(__ubuf__  int4b_t* dst_align32b, vector_int4x2_t src0, vector_int4x2_t src1, iter_reg offset)
    
  • 从 掩 码 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景
    C++
    // NORM搬 出 模 式
    __simd_callee__ inline void asc_storealign(__ubuf__ uint32_t* dst, vector_bool src, iter_reg offset)
    __simd_callee__ inline void asc_storealign(__ubuf__ uint16_t* dst, vector_bool src, iter_reg offset)
    __simd_callee__ inline void asc_storealign(__ubuf__ uint8_t* dst, vector_bool src, iter_reg offset)
    
    // PACK搬 出 模 式
    __simd_callee__ inline void asc_storealign_pack(__ubuf__ uint32_t* dst,  vector_bool src,  iter_reg offset)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__ uint16_t* dst,  vector_bool src,  iter_reg offset)
    __simd_callee__ inline void asc_storealign_pack(__ubuf__ uint8_t* dst,  vector_bool src,  iter_reg offset)
    

参 数 说 明

  • 从 矢 量 数 据 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景

    参 数 名输 入/输 出描 述
    dst_align32b输 出目 的 操 作 数(矢 量)的 起 始 地 址。
    src输 入源 操 作 数(矢 量 数 据 寄 存 器)。
    src0输 入源 操 作 数0(矢 量 数 据 寄 存 器)。
    src1输 入源 操 作 数1(矢 量 数 据 寄 存 器)。
    mask输 入源 操 作 数 掩 码(掩 码 寄 存 器),用 于 指 示 在 计 算 过 程 中 哪 些 元 素 参 与 计 算。对 应 位 置 为1时 参 与 计 算,为0时 不 参 与 计 算。mask未 筛 选 的 元 素 在 输 出 中 置 零。
    offset输 入地 址 寄 存 器,存 储 地 址 偏 移 量。
  • 从 掩 码 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景

    参 数 名输 入/输 出描 述
    dst输 出目 的 操 作 数(矢 量)的 起 始 地 址。
    src输 入源 操 作 数(掩 码 寄 存 器)。
    offset输 入地 址 寄 存 器,存 储 地 址 偏 移 量。

矢 量 数 据 寄 存 器、掩 码 寄 存 器 和 地 址 寄 存 器 的 详 细 说 明 请 参 见reg数 据 类 型 定 义.md

返 回 值 说 明

流 水 类 型

PIPE_V

约 束 说 明

调 用 示 例

  • 从 矢 量 数 据 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景
    C++
    __ubuf__ half* dst_align32b = (__ubuf__ half*)asc_get_phy_buf_addr(0);
    vector_half src;
    vector_bool mask = asc_create_mask_b16(PAT_ALL);
    uint32_t offset = 128;
    iter_reg addr_reg = asc_create_iter_reg_b16(offset);
    asc_storealign(dst_align32b, src, addr_reg, mask);
    
  • 从 掩 码 寄 存 器 连 续 对 齐 搬 出 到UB的 场 景
    C++
    __ubuf__ uint32_t* dst = (__ubuf__ uint32_t*)asc_get_phy_buf_addr(0);
    vector_bool src;
    uint32_t offset = 0;
    iter_reg addr_reg = asc_create_iter_reg_b16(offset);
    asc_storealign(dst, src, addr_reg);
    

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