写点什么

什么是 CANN 和 Ascend C

作者:zjun
  • 2024-12-18
    上海
  • 本文字数:2174 字

    阅读完需:约 7 分钟

什么是CANN和Ascend C

1 CANN 是什么

异构计算架构 CANN(Compute Architecture for Neural Networks)是华为针对 AI 场景推出的异构计算架构,向上支持多种 AI 框架,包括 MindSpore、PyTorch、TensorFlow 等,向下服务 AI 处理器与编程,发挥承上启下的关键作用,是提升昇腾 AI 处理器计算效率的关键平台。同时针对多样化应用场景,提供多层次编程接口,支持用户快速构建基于昇腾平台的 AI 应用和业务。

1.1 总体架构

CANN 提供了功能强大、适配性好、可自定义开发的 AI 异构计算架构。



  • GE 图引擎( Graph Engine),是计算图编译和运行的控制中心,提供图优化、图编译管理以及图执行控制等功能。GE 通过统一的图开发接口提供多种 AI 框架的支持,不同 AI 框架的计算图可以实现到 Ascend 图的转换。

  • Ascend C 算子开发语言,是 CANN 针对算子开发场景推出的编程语言,原生支持 C 和 C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力 AI 开发者低成本完成算子开发和模型调优部署。

  • AOL 算子加速库(Ascend Operator Library),提供了丰富的深度优化、硬件亲和的高性能算子,包括神经网络(Neural Network,NN)库、线性代数计算库(Basic Linear Algebra Subprograms,BLAS)等,为神经网络在昇腾硬件上加速计算奠定了基础。

  • HCCL 集合通信库(Huawei Collective Communication Library),是基于昇腾硬件的高性能集合通信库,提供单机多卡以及多机多卡间的数据并行、模型并行集合通信方案。HCCL 支持 AllReduce、Broadcast、Allgather、ReduceScatter、AlltoAll 等通信原语,Ring、Mesh、HD 等通信算法,在 HCCS、RoCE 和 PCIe 高速链路实现集合通信。

  • BiSheng Compiler 毕昇编译器,提供 Host-Device 异构编程编译能力,利用微架构精准编译优化释放昇腾 AI 处理器极致性能,提供完备二进制调试信息与二进制工具链,支撑 AI 开发者自主调试调优。

  • Runtime 运行时,提供了高效的硬件资源管理、媒体数据预处理、单算子加载执行、模型推理等开发接口,供开发者轻松构建高性能人工智能应用。

1.2 关键功能特性

  • 推理应用开发 CANN 提供了在昇腾平台上开发神经网络应用的昇腾计算语言 AscendCL(Ascend Computing Language),提供运行资源管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等 API,实现利用昇腾硬件计算资源、在昇腾 CANN 平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。简单来说,就是统一的 API 框架,实现对所有资源的调用。

  • 模型训练 CANN 针对训练任务提供了完备的支持,针对 PyTorch、TensorFlow 等开源框架网络模型,CANN 提供了模型迁移工具,支持将其快速迁移到昇腾平台。此外,CANN 还提供了多种自动化调测工具,支持数据异常检测、融合异常检测、整网数据比对等,帮助开发者高效问题定位。

  • 算子开发 CANN 提供了超过 1400 个硬件亲和的高性能算子,可覆盖主流 AI 框架的算子加速需求,同时,为满足开发者的算法创新需求,CANN 开放了自定义算子开发的能力,开发者可根据自身需求选择不同的算子开发方式。详细了解可见:CANN是什么

2 Ascend C 是什么

面向算子开发场景的编程语言 Ascend C,原生支持 C 和 C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力 AI 开发者低成本完成算子开发和模型调优部署。使用 Ascend C 进行自定义算子开发的突出优势有:


  • C/C++原语编程

  • 编程模型屏蔽硬件差异,编程范式提高开发效率

  • 类库 API 封装,从简单到灵活,兼顾易用与高效

  • 孪生调试,CPU 侧模拟 NPU 侧的行为,可优先在 CPU 侧调试

2.1 用 Ascend C 写一个“hello world”

掌握一个门编程语言或者技术的开张,一般都是从写一个“hello world”开始。Ascend C 也不例外,作为类似于 Cuda 上的 cudnn,看如何实现一个算子运行输出“hello world”。

2.1.1 实现一个核函数

包含核函数的 Kernel 实现文件 hello_world.cpp 代码如下:核函数 hello_world 的核心逻辑为打印"Hello World"字符串。hello_world_do 封装了核函数的调用程序,通过<<<>>>内核调用符对核函数进行调用。


include "kernel_operator.h"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>>>();}
复制代码

2.1.2 实现一个调用程序

#include "acl/acl.h"extern void hello_world_do(uint32_t coreDim, void* stream);
int32_t main(int argc, char const *argv[]){ // AscendCL初始化 aclInit(nullptr); // 运行管理资源申请 int32_t deviceId = 0; aclrtSetDevice(deviceId); aclrtStream stream = nullptr; aclrtCreateStream(&stream);
// 设置参与运算的核数为8 constexpr uint32_t blockDim = 8; // 用内核调用符<<<>>>调用核函数,hello_world_do中封装了<<<>>>调用 hello_world_do(blockDim, stream); aclrtSynchronizeStream(stream); // 资源释放和AscendCL去初始化 aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0;}
复制代码


本样例共调度八个核,分别打印了每个核的核号和"Hello World"信息。Ascend C 可以参考:HelloWorld-快速入门-Ascend C算子开发-算子开发-CANN商用版8.0.RC2.2开发文档-昇腾社区

用户头像

zjun

关注

还未添加个人签名 2020-03-06 加入

还未添加个人简介

评论

发布
暂无评论
什么是CANN和Ascend C_CANN_zjun_InfoQ写作社区