一、SPMD 编程模型详解

Ascend C 算子编程采用SPMD(单程序多数据) 范式,核心原理如下:

  • 数据并行:将输入数据拆分为多个分片,分配给多个 AI Core 并行处理,所有 AI Core 共享相同的指令代码。
  • 核身份识别:每个执行核函数的 AI Core 会被分配唯一逻辑 ID(通过内置变量block_idx标识),开发者可通过kldx()函数获取该 ID,为不同核定义差异化数据处理逻辑。
  • 开发简化:开发者仅需关注单个 AI Core 的算子实现逻辑,框架自动完成多 Core 调度与数据分发,降低并行开发复杂度。

SPMD 模型数据处理流程

  1. 输入数据按预设规则(如均分)切分为 N 个分片(N 为参与计算的 AI Core 数量)。
  2. 每个 AI Core 获取一个数据分片,执行相同的指令代码。
  3. 各 AI Core 通过block_idx识别自身处理的数据分片,完成计算后输出局部结果。
  4. 框架汇总所有 AI Core 的局部结果,生成最终输出。

二、核函数定义与调用

(一)核函数定义规则

核函数是 Ascend C 算子在 Device 侧的入口函数,需通过特定修饰符标识运行属性:

  • __global__:标识核函数可通过<...>>>内核调用符调用,运行在 Device 侧。
  • __aicore__:标识核函数在 AI Core 上执行(区别于 AI CPU)。
  • __gm__:指针入参修饰符,表明该指针指向 Global Memory 中的内存地址,通常通过GM_ADDR宏统一封装(#define GM_ADDR __gm__ uint8_t)。

(二)核函数定义示例

#include "kernel_operator.h"
using namespace AscendC;

// 核函数定义:打印"Hello World"
extern "C" __global__ __aicore__ void hello_world() {
    AscendC::printf("Hello World!!!\n");
}

// 核函数调用封装:通过内核调用符<<<>>>规定执行配置
void hello_world_do(uint32_t blockDim, void* stream) {
    hello_world<<<blockDim, nullptr, stream>>>();
}

(三)核函数调用参数说明

内核调用符<<<blockDim, l2ctrl, stream>>>的参数含义如下:

三、Hello World 实战:核函数调用全流程

(一)Host 侧调用代码

#include "acl/acl.h"
extern void hello_world_do(uint32_t coreDim, void* stream);

int32_t main(int argc, char const *argv[]) {
    // 1. AscendCL初始化
    aclInit(nullptr);

    // 2. 运行管理资源申请
    int32_t deviceId = 0;
    aclrtSetDevice(deviceId);  // 绑定设备
    aclrtStream stream = nullptr;
    aclrtCreateStream(&stream);  // 创建任务队列

    // 3. 配置核函数执行参数(使用8个AI Core)
    constexpr uint32_t blockDim = 8;
    hello_world_do(blockDim, stream);  // 调用核函数

    // 4. 等待任务执行完成
    aclrtSynchronizeStream(stream);

    // 5. 资源释放与AscendCL去初始化
    aclrtDestroyStream(stream);
    aclrtResetDevice(deviceId);
    aclFinalize();

    return 0;
}

(二)关键接口说明

训练营简介
2025 年昇腾 CANN 训练营第二季,基于 CANN 开源开放全场景,推出 0 基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得 Ascend C 算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。

报名链接
https://www.hiascend.com/developer/activities/cann20252?tab=overview
 

Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐