CANN 中 Block 完整含义(昇腾算子开发)

CANN 里 Block 分两层语境:硬件调度的 Block、算子 tiling 分块 Block,二者经常混用,分开讲清楚。

一、硬件调度:Task Block(AI Core Block / 核块)

1. 定义

昇腾 NPU 由多个独立 AI Core 组成,调度器会把计算任务切分成若干 Block,分配到不同 AI Core 并行执行。

  • 一个 Block = 分配给单个 AI Core 的一整份独立计算任务;
  • 硬件上:多个 Block 多 AI Core 并行跑,天然数据并行。

核心特点

  1. Block 之间内存隔离
    每个 Block 独占自己 AI Core 的 Local Memory(L0/L1),Block A 无法访问 Block B 的 Local;
    所有 Block 共享同一份 Global Memory。
  2. 并行粒度
    比如 910B 有 32 个 AI Core,最多同时调度 32 个 Block 并发计算。
  3. 分工逻辑
    大张量在 Global 按维度切分,每一块数据交给一个 Block(AI Core)单独计算,最后写回 Global。

二、算子计算分块:Tiling Block(数据块/计算块)

算子内部,单 AI Core 内部仍要对数据切分,这片小块数据也叫 Block,即 tiling 块。

1. 产生原因

Local Memory 空间很小,无法一次性放下整个 Block 对应的完整输入,因此单个 AI Core 任务还要再切更小的数据块:
完整张量 → 切分给多AI Core:Task Block → 单Core内再切:Tiling Block

数据流关系

  1. Global 大张量拆分 → 多个 Task Block(分给不同AI Core)
  2. 单个 Task Block 数据量仍大于 Local 容量 → 再拆成多个 Tiling Block
  3. 循环:搬运 1 个 Tiling Block 到 Local → 计算 → 写回 Global,循环处理完当前 Task Block

三、关键概念区分(最容易混淆)

  1. Task Block(AI Core Block)
    并行维度,对应一个 AI Core,跨核粒度;
    控制多核心并行度。
  2. Tiling Block(本地计算块)
    单核内部循环粒度,解决 Local 内存不足;
    控制 Global ↔ Local 搬运次数。
  3. Local Memory:单个 Task Block 私有,所有 Tiling Block 共用这片 Local。
  4. Global Memory:所有 Task Block 共享。

四、代码层面体现

  1. 调度层(Kernel Launch / KernelParam)
    设置 block_num:指定启动多少个 Task Block,等于启用多少AI Core。
    // 示例:启动16个Block,跑在16个AI Core上
    uint32_t block_num = 16;
    
  2. 算子核内(AI Core 函数)
    通过 GetBlockIdx() 获取当前 Block 的编号,用来读取 Global 上属于自己的分片数据:
    uint32_t block_idx = GetBlockIdx();
    // 根据block_idx偏移,读取本Block负责的Global数据区间
    
  3. 单核内 tiling 循环
    for 循环遍历每一个小 tiling Block,调用 DataCopy 搬入 Local 计算。

五、简单例子理解

以卷积输入特征图 N=32,AI Core=8:

  1. Task Block 切分:N 维度分成 8 份,block_num=8,每个 Block 处理 4 张图;
  2. 单个 Block 的 4 张图数据太大塞不下 Local;
  3. 内部再拆成多个 Tiling Block,分批搬运、计算;
  4. 8 个 Block 在 8 个 AI Core 同时并行计算。

六、补充易混点

  1. 和 CUDA Block 的区别
    • CUDA:Block 内包含多个 Thread;
    • CANN:一个 Block 对应一整个 AI Core,Block 内部无线程概念,AI Core 内部靠 Vector/Cube 硬件流水线并行。
  2. BlockIdx 作用
    唯一标识当前 AI Core,用来做 Global 数据分片偏移,保证各 Block 读写互不干扰(优化访存、避免冲突)。
  3. 性能优化点
    • block_num 尽量匹配硬件AI Core数量,充分并行;
    • 每个 Block 负载均衡,避免部分核空闲;
    • 控制 Tiling Block 大小,填满 Local 减少数据搬运次数。
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐