书名:Ascend C 异构并行程序设计——昇腾算子编程指南
ISBN:978-7-115-64972-0
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 苏统华 杜 鹏 闫长江
责任编辑 邓昱洲
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书以昇腾算子编程语言Ascend C的高效开发为核心,系统介绍华为面向人工智能的昇腾AI处理器架构、硬件抽象及其软件栈。本书由浅入深,通过案例讲解知识点,理论与实践并重。全书分为6章,分别介绍了昇腾AI处理器软硬件架构、Ascend C 快速入门、Ascend C编程模型与编程范式、Ascend C算子开发流程、Ascend C算子调试调优和Ascend C大模型算子优化。
本书适合人工智能产业的研发人员阅读,也适合软件工程、人工智能、信息安全、大数据、物联网等专业的本科生学习。
主 任:吕卫锋 北京航空航天大学副校长
副主任:马殿富 北京航空航天大学计算机学院教授
何钦铭 浙江大学计算机科学与技术学院教授
何炎祥 武汉大学计算机学院教授
彭红华 华为ICT战略与业务发展部总裁
卢 广 华为中国战略与Marketing部部长
孙 虎 华为服务Fellow、首席项目管理专家
孙 刚 华为ICT人才伙伴发展部部长
编 委:(按姓氏音序排列)
范 举 中国人民大学信息学院教授
方 娟 北京工业大学计算机学院副院长
郭 耀 北京大学计算机学院副院长
刘耀林 华为ICT人才伙伴发展部校企合作总监
苏统华 哈尔滨工业大学软件学院副院长
孙海龙 北京航空航天大学软件学院教授
王 菡 北京邮电大学叶培大创新创业学院副院长
王景全 华为基础软件人才发展总监
王 新 华为中国区产业发展与生态部总工
魏 彪 华为ICT学院合作总监
周 烜 华东师范大学数据科学与工程学院副院长
当下,信息技术的浪潮正以惊人的速度重塑着全球社会经济的版图。云计算、大数据、人工智能、物联网等新一代信息技术不断涌现,推动产业结构经历深刻的变革。在这场技术革命中,基础软件扮演着至关重要的角色,它不仅是信息系统的基石,更是技术创新的源泉和信息安全的守护者。
回首数十年来我国基础软件的发展历程,国家在这一领域倾注了大量资源。得益于国家科技重大专项和政策的有力支持,我国的基础软件实现了迅猛发展,步入了快车道。国产软件阵营蔚为壮观,操作系统、数据库管理系统、中间件等核心领域硕果累累,不仅在国内市场占据了一席之地,更在多个关键领域跻身国际先进行列。随着开源生态的逐步繁荣,我国也积极响应,拥抱开源生态建设。我们目睹了openEuler、OpenHarmony等国产操作系统的蓬勃发展,见证了MindSpore人工智能框架的突破性创新,以及Ascend C编程语言的闪亮登场。在华为等科技企业和广大开发者的共同努力下,基础软件在开源生态蓬勃发展的推动下取得了更大的成就。这些成就是我国基础软件实力的有力证明,也是自主创新能力的生动展示。它们不仅彰显了我国在全球化技术竞争中的坚定立场,更体现了对技术自主权的坚守与对自主创新的决心。
在全球化的技术竞争中,自主创新是我们的必由之路,开源生态建设是关键一环。开源生态支持多元化的技术体系和发展路径,有助于形成多样化的产业生态系统,满足不同行业和领域的需求;推动了技术和接口的标准化,使得不同软件之间能够更容易地实现互操作和集成;促使资源共享,减少了重复开发和资源浪费,提高了资源的利用效率。因此,未来基础软件的发展离不开开源生态的建设。
当前,在核心技术、产业生态和国际标准制定上,我国的基础软件与国际先进水平仍有一定的差距。我们必须深化对基础软件的认识,加大研发投入,更加积极地拥抱开源生态建设,培育卓越人才,以确保在科技革命和产业变革中占据有利地位。当下,各大高校正在构建相关课程体系,强化理论与实践结合,建立先进的基础软件实验室,通过校企合作,推动学术与产业的融合,致力于培养具有国际视野的高水平基础软件人才。
由此,我们精心编撰了这一丛书,以响应国家对基础软件国产化替代的战略需求,为信息技术行业的人才培养提供有力的知识支持。本丛书以国产基础软件为核心,全面覆盖操作系统、数据库、编程语言、人工智能等关键技术领域,深入剖析基础软件的发展历程、核心技术、应用案例及未来趋势,力图构建多维度、立体化的知识架构,为读者提供全方位的视角。
本丛书在内容布局上,注重系统性与实用性的结合,侧重于培养读者的实践能力和创新思维。我们不仅深入探讨基础软件的理论基础与技术原理,更通过丰富的实际案例与应用场景,展示华为等企业在该领域的最新成果与创新实践,引导读者将理论知识转化为解决实际问题的能力。本丛书的编撰团队由国内一流院校的教师和业界资深专家组成,他们深厚的学术背景和丰富的实践经验,为丛书内容的权威性和实用性提供了坚实保障。
我们期望通过这套丛书,传播国产基础软件的先进理念与优秀成果,激发广大师生与从业人员的使命感,鼓励他们投身于我国基础软件国产化的创新征程。我们坚信,唯有汇聚全社会的智慧与力量,持续推动创新,才能实现我国基础软件的自主可控与高质量发展。让我们携手并进,共同推动新一代信息技术的繁荣发展,助力我国从信息技术大国迈向信息技术强国。
北京航空航天大学副校长 吕卫锋
当下,AI创新风起云涌,大模型“百花齐放”,云计算步入“黄金时代”……我们看到,以人工智能、云计算、大数据等为代表的新一代信息技术加速突破应用,推动社会生产方式变革、创造人类生活新空间。基础软件作为新一代信息技术的底座,为信息产业和数字经济的发展提供了强有力的支撑,它不仅是各种应用软件运行的平台,还承载着数据处理、网络通信、系统安全等核心功能。一个强大、稳定、高效的基础软件体系,能够确保整个信息产业和数字经济的顺畅运行,为各种创新应用提供坚实的土壤。因此,基础软件技术也被称为“根技术”。
为构筑软件行业的根基,华为与全球伙伴一起,围绕鲲鹏、昇腾、欧拉、CANN、昇思等产品,构建数字基础设施生态,打造数字世界的算力底座。同时,华为秉持包容、公平、开放、团结和可持续的理念,与开发者共建世界级开源社区,加速软件创新和共享生态繁荣。
人才是高科技产业的关键资源。基础软件作为底层技术,通用性和专业性更强,因此需要更多对操作系统领域有深入研究、有自主创新能力的人才。
在ICT人才培养方面,华为已沉淀了30多年的丰富经验。华为将这些在ICT行业中摸爬滚打积累而来的经验、技术、人才培养标准贡献出来,联合教育主管部门、高等院校、培训机构和合作伙伴等各方生态角色,通过建设人才联盟、融入人才标准、提升人才能力、传播人才价值,构建良性ICT人才生态,从而促进科技进步、产业繁荣,助推社会可持续发展。
为培养高校ICT人才,从2013年起,华为携手全球高校共建华为ICT学院。这一校企合作项目通过提供完善的课程体系,搭建线上学习和实验平台,培养师资力量,携手高校培养创新型和应用型人才;同时通过例行发布ICT人才白皮书,举办华为ICT大赛、华为ICT人才双选会等,营造人才成长的良好环境和通路,促进人才培养良性循环。
教材是知识传递、人才培养的重要载体,华为通过校企合作模式出版教材,助力高校人才培养模式改革,推动ICT人才快速成长。为培养基础软件人才,华为聚合技术专家、高校教师等,倾心打造华为ICT学院教材。本丛书聚焦华为基础软件,内容覆盖 OpenHarmony、openEuler、MindSpore、Ascend C等基础软件技术方向,系统梳理和融合前沿基础软件技术;包含大量基于真实工作场景编写的行业实际案例,理实结合;将知识条理清晰、由浅入深地拆解分析,逻辑严谨;配套丰富的学习资源,包括源代码、实验手册、在线课程、测试题等,利于学习。本丛书既适合作为高等院校相关课程的教材,也适合作为参与相关技术方向华为认证考试的参考书,还适合计算机爱好者用以学习和探索基础软件的开发和应用。
智能化的大潮正在奔涌而来,未来智能世界充满机遇和挑战。同学们,请在基础软件的知识海洋中遨游,完成知识积累,拓展实践能力,提升软件技能,为未来职场蓄力。华为也期待与你们携手,共同打造根深叶茂的操作系统基座和开源生态系统,为促进基础软件根技术生态发展、实现科技创新、促进数字经济高速增长贡献力量。
华为ICT战略与业务发展部总裁 彭红华
人工智能是一门研究、制造智能机器或智能系统,并实现模拟、延伸和扩展人类智能的学科。“人工智能”这一术语是在1956年举办的为期2个月的达特茅斯会议上提出的。会上,约翰·麦卡锡(John McCarthy)、马文·明斯基(Marvin Minsky)、克劳德·香农(Claude Shannon)和纳撒尼尔·罗切斯特(Nathaniel Rochester)等10位倡导者不遗余力地推进“从理论上精确描述学习的内涵或者智能的其他特性,达到制造一台机器来模拟它”的提议,这被誉为人工智能学科的开端。人工智能从此带着使命和活力步入人类世界,开辟了一片崭新的科学天地。
虽然人工智能的发展并非一帆风顺,甚至几经跌宕,但不曾中断。进入 21 世纪,随着异构计算芯片的成熟,基于大数据的深度学习方法在计算机视觉领域中屡创佳绩,明显超越人类专家。2016年,AlphaGo 战胜围棋世界冠军李世石,进一步推动了强化学习在游戏、具身智能等领域的发展。2020年,AlphaFold 2在第14届蛋白质结构预测大赛(CASP14)中,展示了前所未有的预测精度,远超其他方法,掀起了AI for Science热潮。2023年,以ChatGPT为代表的大语言模型,在自然语言理解与生成、知识整合与检索、文本翻译、创意写作等领域达到了令人惊叹的水平,标志着人工智能技术的发展到达了一个高峰。
华为公司为深度学习量身打造了“达·芬奇(Da Vinci)架构”,并基于该架构在2018年推出了昇腾(Ascend)AI处理器,开启了人工智能之旅。面向计算机视觉、自然语言处理、推荐系统、类机器人等领域,昇腾AI处理器致力于打造云端一体化的全栈式、全场景解决方案。2023年5月,为了释放昇腾AI处理器的性能,华为继推出昇腾异构计算架构(Compute Architecture for Neural Networks,CANN)后,又发布了面向算子开发场景的昇腾编程语言(Ascend C)。Ascend C原生支持C和C++语言的标准规范,匹配用户开发习惯,并提供了一组高度封装的高性能类库接口供开发者拼装算子核心逻辑。Ascend C 将核函数编程模型结构化为搬入、计算、搬出3个阶段,并通过极简的开发逻辑,实现自动的流水线任务并行调度,将算子执行性能最大化。另外,Ascend C支持Host与Device混合编程,让开发者可以在Host应用程序中轻松实现分别在CPU与NPU上运行算子代码;提供了算子孪生调试能力,让开发者既可以在CPU上通过业界标准C++工具GDB单步调试,也可以在NPU上通过上板调试。CPU和NPU相结合的调试方式大大提升了Ascend C算子调试和调优的效率。
本书围绕Ascend C展开论述。第1章介绍华为面向人工智能的昇腾AI处理器软硬件架构,包括Atlas硬件计算平台、达·芬奇架构、昇腾异构计算架构等。第2章是Ascend C快速入门,包括并行计算的基本原理、Ascend C开发环境准备、Ascend C算子的开发调用等。第3章详细介绍Ascend C编程模型与编程范式,并展示几个使用Ascend C完成的深度学习实用算子样例。第4章介绍Ascend C算子开发流程,此外还包括算子工程的编译部署、PyTorch算子调用以及如何在整网中替换Ascend C算子等。第5章介绍Ascend C算子调试调优。第6章面向Ascend C大模型算子优化,介绍目前业界流行的自注意力算子和基于Ascend C的实现方法。
本书在编写过程中得到了多方面的帮助,在此表示感谢!本书编写团队成员还包括哈尔滨工业大学的李行、陈潇凯、陈庚天、李松泽等,他们在内容选材、制作实践案例上做出了重要贡献。本书的出版得到华为公司的大力支持,王海彬组织了Ascend C技术专家团队全程支持,傅涛作为技术对接人提供了丰富的素材,董雪峰、李晨吉、黄金华、李东峰、王凯等技术专家提出了很多宝贵的修改意见。本书在外审及试读阶段得到西安交通大学李阳老师,浙江大学唐敏老师,浙江大学吴月锋、俞子轩、陈威3位同学,哈尔滨工业大学谭济卓等同学的宝贵意见。本书得到国家自然科学基金项目(62277011)、黑龙江省高等教育教学改革研究重点委托项目(SJGZ20220011)及哈尔滨工业大学新形态教材项目等科研、教学项目的资助。
由于水平和时间所限,书中难免存在疏漏和不足之处,恳请读者指正,可发送邮件至dengyuzhou@ptpress.com.cn。
扫码观看视频
本书配套PPT和代码资源请用PC浏览器登录https://box.lenovo.com/l/8uf9SX下载。读者请发邮件至thsu@hit.edu.cn索取测验题答案。
本章介绍昇腾AI处理器软硬件架构,为读者学习昇腾AI程序设计建立必要的基础。首先介绍Atlas硬件计算平台,其次分析昇腾AI处理器的组成结构,随后进一步介绍昇腾AI处理器达·芬奇架构的AI Core(昇腾AI处理器的核心算力部件),包括计算单元、存储系统、控制单元和指令集设计,接着介绍如何使用硬件感知功能了解自己的硬件配置,最后简要介绍昇腾异构计算架构,为进一步学习Ascend C做好铺垫。
扫码观看视频
扫码观看视频
昇腾 AI 处理器面向云—边—端全场景,可以提供强大的算力支持,不仅能满足加速海量目标推理过程的需求,也能提供大规模、复杂模型在海量数据上训练所需要的计算密集型算力。昇腾 AI 处理器包括集群、服务器、加速卡、智能小站、加速模块等形态各异的产品,一起构成了Atlas系列硬件产品,它们是华为面向云—边—端全场景布局的AI基础设施方案,如图1-1所示。用户可以在硬件产品上搭建特定的Atlas硬件计算平台。
图1-1 Atlas系列硬件产品
目前,已发布Atlas 200 AI加速模块、Atlas 500智能小站、Atlas 300 AI加速卡、Atlas 800 AI服务器,以及Atlas 900 AI集群,可广泛用于平安城市、智能交通、智能医疗、智能零售、智能金融等领域。接下来将重点介绍与大模型训练相关的 Atlas 服务器和Atlas集群。
华为提供了基于昇腾AI处理器和鲲鹏/英特尔CPU处理器平台的Atlas服务器,分为推理服务器和训练服务器。Atlas推理服务器采用标准2U服务器形态,如图1-2所示。它集AI推理、存储和网络于一体,可以容纳最大8张昇腾AI推理CPU卡,提供最大704 TOPS int8的推理性能,可用于视频分析、光学字符识别(Optical Character Recognition,OCR)、精准营销、医疗影像分析等推理服务。
图1-2 Atlas推理服务器
Atlas训练服务器采用标准4U服务器形态,如图1-3所示。它通过PCI-e接口集成8个昇腾AI训练处理器,提供2.24 PFLOPS@ FP16的大算力,最大整机功率为5.6 kW,支持风冷和水冷两种散热方式,可广泛应用于深度学习模型的开发和训练。Atlas训练服务器适用于智慧城市、智慧医疗、天文探索、石油勘探等需要大算力的领域。
图1-3 Atlas训练服务器
另外,华为面向边缘应用需求还推出了Atlas边缘服务器,如图1-4所示。它采用标准2U服务器形态,集AI推理、存储和网络于一体,可以容纳最大4张昇腾AI推理CPU卡,提供352 TOPS int8的推理性能。边缘服务器拥有475 mm的短机箱,支持600 mm的短机柜,可以在边缘场景中广泛部署。
图1-4 Atlas边缘服务器
Atlas集群由数千个昇腾AI训练处理器构成,外形如图1-5所示。Atlas集群通过华为集群通信库和作业调度平台,整合华为缓存一致系统(Huawei Cache Coherence System,HCCS)、PCI-e 4.0和100GE RoCE这3种高速接口,充分释放了昇腾AI训练处理器的强大性能。它的总算力达到256~1024 PFLOPS@ FP16,相当于50万台高性能PC的计算能力。这可以让研究人员更快地进行图像、语音AI模型训练,让人类更高效地探索宇宙奥秘、预测天气、勘探石油及加速自动驾驶的商用进程。
图1-5 Atlas集群
扫码观看视频
昇腾AI处理器的芯片本质上是片上系统(System on Chip,SoC),主要应用在和图像、视频、语音、文字处理相关的场景。该处理器芯片的主要组成部件包括特制的计算单元、大容量的存储单元和相应的控制单元,逻辑架构如图1-6所示。它封装了Virtuvian主芯片、4个高带宽内存(High Bandwidth Memory,HBM)堆栈式芯片和Nimbus I/O芯片。这些部件通过1024位的二维网格结构的CHIE片上网络连接起来。昇腾AI处理器有 4 个数字视频预处理(Digital Video Pre-Processing,DVPP)模块,可以处理 128 通道全高清视频(H.264/H.265)。
昇腾AI处理器的芯片集成了若干个达·芬奇架构的AI Core,负责执行矩阵、向量计算密集的任务,还集成了数个CPU核心,每4个核心构成一个簇。其中一部分核心部署为AI CPU,承担部分AI计算功能(负责执行不适合运行在AI Core上的算子任务);另一部分核心部署为系统控制CPU,负责整个SoC的控制功能。此外,芯片内有层次化的存储结构。AI Core内部有两级内存缓冲区,SoC片上还有L2缓冲区,专门为AI Core和AI CPU提供高带宽、低延迟的内存访问服务。芯片连接了4个高带宽内存控制器(High Bandwidth Memory Controller,HBMC),并提供PCI-e服务。
注:DMA即Direct Memory Access,直接存储器访问;NIC即Network Interface Card,网络接口卡;STARS即System Task And Resource Scheduler,系统任务和资源调度器;IMU即I/O board Management Unit,I/O板管理单元。
图1-6 昇腾AI处理器芯片的逻辑架构
该芯片真正的算力担当是采用了达·芬奇架构的AI Core。这些AI Core通过特别设计的架构和电路实现了高通量、大算力和低功耗的特性,特别适合处理深度学习中神经网络的常用计算,如矩阵乘法等。由于芯片采用了模块化的设计,可以很方便地通过叠加模块的方法提高后续芯片的计算力。针对深度神经网络参数量大、中间值多的特点,该芯片还特意为 AI计算引擎配备了片上缓冲区(On-chip Buffer),以提供高带宽、低延迟、高效率的数据交换和访问服务。能够快速访问所需的数据对于提高 AI 算法的整体性能至关重要,同时,将大量需要复用的中间数据缓存在片上对于降低系统整体功耗意义重大。
DVPP模块主要完成图像和视频的编解码,支持4K(4096像素×2160像素)分辨率视频处理,同时支持对JPEG和PNG等格式图像的处理。来自主机端存储器或网络的视频和图像数据,在进入昇腾AI处理器芯片的AI计算引擎处理之前,需要具备满足处理要求的数据输入格式、分辨率等标准,因此需要调用DVPP模块进行预处理以达到格式和精度转换等要求。DVPP模块主要提供视频解码(Video Decoder,VDEC)、视频编码(Video Encoder,VENC)、JPEG编解码(JPEG Encoder/Decoder,JPEGD/E)、PNG解码(PNG Decoder,PNGD)和图像预处理(Vision Pre-Processing Core,VPC)等功能。图像预处理可以完成对输入图像的上/下采样、裁剪、色调转换等多种处理任务。DVPP模块采用了专用定制电路的方式来实现高效率的图像处理功能,对应于每一种不同的功能都会设计一个相应的硬件电路模块来完成计算工作。在DVPP模块收到图像和视频处理任务后,会通过双倍数据速率(Double Data Rate,DDR)存储从内存中读取需要处理的图像和视频数据,并分发到内部对应的处理模块进行处理,待处理完成后将数据写回内存,等待后续执行步骤。
扫码观看视频
达·芬奇架构(Da Vinci Architecture)是华为面向计算密集型人工智能应用研发的计算架构,也是昇腾AI处理器芯片AI Core的核心架构。昇腾AI处理器(Atlas A2训练系列产品)分离架构AI Core的基本结构如图1-7所示。不同于传统的支持通用计算的CPU和GPU,也不同于专用于某种特定算法的专用集成电路(Application Specific Integrated Circuit,ASIC),达·芬奇架构的芯片本质上是为了适应某个特定领域常见的应用和算法而设计的,通常被称为特定域架构(Domain Specific Architecture,DSA)芯片,从控制层面上可以被看成一个相对简化的现代微处理器的基本架构。
图1-7 分离架构AI Core的基本结构
AI Core负责执行与标量、向量和张量相关的计算密集型算子,包括3种基础计算资源:矩阵计算单元(Cube Unit)、向量计算单元(Vector Unit)和标量计算单元(Scalar Unit)。3种计算单元分别对应张量计算、向量计算和标量计算这3种常见的计算模式。在昇腾AI处理器的AI Core中集成了两个独立的模块,即矩阵计算模块(AI Cube,AIC)和向量计算模块(AI Vector,AIV),从而实现了矩阵计算与向量计算的解耦,即矩阵计算和向量计算完全独立并行,在系统软件的统一调度下互相配合,达到优化计算效率的目的。此外,在矩阵计算单元和向量计算单元内部还提供了不同精度、不同类型的计算模式。目前AI Core中的矩阵计算单元可以支持8位整型数(int8)、16位浮点数(FP16)及32位浮点数(FP32)的计算,向量计算单元可以直接支持FP16和FP32的计算,通过转换可以支持包括整型数在内的多种数据类型的计算。
为了配合AI Core中数据的传输和搬运,围绕这3种计算资源还分布式地设置了一系列位于矩阵计算单元中的存储资源,称为张量缓冲区。张量缓冲区是分别放置整体图像特征数据、网络参数、中间结果的缓冲区,也为一些临时变量提供高速的寄存器单元。其中,L0 缓冲区(L0 Buffer)和统一缓冲区(Unified Buffer,UB)均属此列,寄存器单元则位于各个计算单元中。这些存储资源的设计架构和组织方式不尽相同,但都是为了更好地适应不同计算模式下的格式、精度和数据排布的需求。这些存储资源或和相关联的计算资源相连,或和总线接口(Main Bus Interface,MBI)相连,从而可以通过张量DMA(Tensor DMA)获得外部总线上的数据。
AI Core 中的控制单元主要包括指令缓存(Instruction Cache)模块、标量控制(Scalar Control)模块、矩阵指令队列(Matrix Issue Queue)模块、向量指令队列(Vector Issue Queue)模块、存储转换指令队列(DMA Issue Queue)模块和事件同步(Event Sync)模块。系统控制模块负责指挥 AI Core的整体运行,协调运行模式,配置参数和控制功耗等任务。标量控制模块的标量指令处理队列主要实现控制指令的译码,根据指令的不同类型,将其分别发射到对应的矩阵指令队列、向量指令队列或存储转换指令队列。3 个队列中的指令依据先进先出的原则分别输出到对应的矩阵计算单元、向量计算单元和存储转换单元进行相应的计算。不同的指令队列和计算资源构成了独立的流水线,可以并行执行以提高指令的执行效率。如果指令执行过程中出现依赖关系或者有强制的时间先后顺序要求,则可以通过事件同步模块来调整和维护指令的执行顺序。事件同步模块完全由软件控制,在软件编写的过程中可以通过插入同步信号的方式来指定每一条流水线的执行时序,从而达到调整指令执行顺序的目的。
在AI Core中,存储单元为各个计算单元提供转置过并符合要求的数据,计算单元将计算结果返回存储单元,控制单元为计算单元和存储单元提供控制指令,三者相互协调,合作完成计算任务。
计算单元是AI Core中提供强大算力的核心单元,相当于AI Core的“主力军”。AI Core的计算单元主要包含标量计算单元(Scalar ALU)、向量计算单元(VEC ALU)、矩阵计算单元(CUBE ALU)和存储计算临时变量的通用寄存器(General Register),如图1-8中虚线框包含的区域所示。矩阵计算单元主要完成矩阵计算,向量计算单元负责执行向量计算,标量计算单元主要用于各类型的标量数据计算和程序的流程控制。
图1-8 AI Core的计算单元
标量计算单元负责完成AI Core中与标量相关的计算。它相当于一个微型CPU,控制整个AI Core的运行。标量计算单元可以对程序中的循环进行控制,实现分支判断,其结果可以通过在事件同步模块中插入同步信号的方式来控制AI Core中其他功能性单元的执行流水线。此外,它可以将不属于标量计算单元执行的指令发射到对应执行单元的执行队列中。它还为矩阵计算单元或向量计算单元提供数据地址和相关参数的计算结果,并且能够实现基本的算术运算。复杂度较高的标量运算则由专门的AI CPU通过算子完成。
在标量计算单元周围配备了多个通用寄存器。这些通用寄存器可以用于变量或地址的寄存,为算术逻辑运算提供源操作数并存储中间计算结果,还支持指令集中一些指令的特殊功能。通用寄存器一般不可以直接访问,只有部分任务可以通过 MOV 指令读写通用寄存器。AI Core 中具有代表性的专用寄存器包括 Core ID(用于标识不同的 AI Core)、VA(向量地址寄存器)及STATUS(AI Core运行状态寄存器)等。软件可以通过监视这些专用寄存器来控制和改变AI Core的运行状态和模式。
由于达·芬奇架构在设计中规定了标量计算单元不能直接通过DDR或HBM访问内存,且自身配给的通用寄存器数量有限,所以在程序运行过程中往往需要在堆栈空间存放一些通用寄存器的值。只有需要使用这些值时,才会将其从堆栈空间中取出来存入通用寄存器。为此将UB的一部分作为标量计算单元的堆栈空间,专门用作标量计算单元的编程。
AI Core中的向量计算单元主要负责完成与向量相关的计算,能够实现单向量或双向量之间的计算,其功能覆盖基本的和定制的计算类型,主要包括FP32、FP16、int32和int8等数据类型的计算。向量计算单元可以快速完成两个FP16类型的向量加法或乘法计算,如图1-9所示。向量计算单元的源操作数和目的操作数通常保存在UB中,一般需要以32字节为基本单位对齐。对向量计算单元而言,输入的数据可以不连续,这取决于输入数据的寻址模式。向量计算单元支持的寻址模式包括向量连续寻址和固定间隔寻址。
图1-9 向量加法和乘法计算
向量计算单元可以完成深度神经网络中的向量函数运算,尤其是卷积神经网络计算中常用的ReLU(Rectified Linear Unit)激活函数、池化(Pooling)、批归一化(BatchNorm)等功能。经过向量计算单元处理后的数据可以被写回UB中,以等待下一次运算。上述所有操作都可以通过软件配合相应的向量计算单元指令来实现。向量计算单元除了提供丰富的计算功能,还可以实现很多特殊的计算函数,从而和矩阵计算单元形成功能互补,全面提升 AI Core对非矩阵类型数据计算的能力。
(1)矩阵乘法
由于常见的深度神经网络算法中大量使用了矩阵计算,达·芬奇架构中特意对矩阵计算进行了深度优化,并定制了相应的矩阵计算单元来支持高吞吐量的矩阵处理。图1-10表示一个矩阵A和另一个矩阵B之间的乘法计算A×B=C,其中M表示矩阵A的行数,K表示矩阵A的列数及矩阵B的行数,N表示矩阵B的列数。
图1-10 矩阵乘法
在传统CPU中,计算矩阵乘法的典型代码如下。
for (m=0; m<M, m++){
for (n=0; n<N, n++){
for (k=0; k<K, k++){
C[m][n] += A[m][k]*B[k][n]}}}
该代码需要用到3个循环进行一次完整的矩阵乘法计算。如果在一个单发射的CPU上执行此代码,总共需要M×K×N个时钟周期才能完成,当矩阵非常庞大时,这个执行过程极为耗时。在CPU计算过程中,矩阵A按行扫描,矩阵B按列扫描。考虑到典型的矩阵存储方式,无论矩阵A还是矩阵B,都会按行存放,也就是所谓的行主序(row-major order)的方式。而读取内存的方式具有极强的数据局部性特征,也就是说,当读取内存中某个数的时候,会打开内存中相应的一整行并且把同一行中所有的数都读取出来。这种读取方式对矩阵A是非常高效的,但是对矩阵B却显得非常不友好,因为代码中矩阵B需要按列读取。为此,需要将矩阵B的存储方式转成按列存储,也就是所谓的列主序(column-major order),如图1-11所示,这样才能够符合内存读取的高效率模式。因此,在矩阵计算中往往通过改变某个矩阵的存储方式来提升矩阵计算的效率。
图1-11 矩阵B存储方式从行存储转成列存储
(2)矩阵计算单元的计算方式
在深度神经网络实现计算卷积的过程中,关键的步骤是将卷积运算转换为矩阵运算。在CPU中,大规模的矩阵计算往往成为性能瓶颈,而矩阵计算在深度学习算法中又极为重要。为了解决这个矛盾,GPU采用了通用矩阵乘法(General Matrix Multiplication,GEMM)的方法来实现矩阵乘法。例如要实现一个16×16矩阵与另一个16×16矩阵的乘法,需要安排256个并行的线程,并且每个线程都可以独立计算完成结果矩阵中的1个输出点。假设每个线程在1个时钟周期内可以完成1次乘加计算,则GPU完成整个矩阵计算需要16个时钟周期,这个延迟是GPU无法避免的重大瓶颈。而昇腾AI处理器芯片针对这个问题做了深度的优化,AI Core对矩阵乘法计算的高效性为昇腾AI处理器芯片作为深度神经网络的加速器提供了强大的性能保障。
达·芬奇架构在AI Core中特意设计了矩阵计算单元作为昇腾AI处理器芯片的核心计算模块,意在高效解决矩阵计算的瓶颈。矩阵计算单元提供超强的并行乘加计算能力,使AI Core能够高速处理矩阵计算问题。通过设计精巧的定制电路和极致的后端优化手段,矩阵计算单元可以快速完成两个16×16矩阵的乘法计算(标记为163,也是Cube这一名称的来历),等同于在极短时间内进行163=4096个乘加计算,并且可以达到FP16的计算精度。矩阵计算单元在完成图1-12所示的A×B=C的矩阵计算时,会事先将矩阵A按行存放在矩阵计算单元的L0A缓冲区中,同时将矩阵B按列存放在矩阵计算单元的L0B缓冲区中,通过矩阵计算单元计算后得到的结果矩阵C按行存放在L0C缓冲区中。
图1-12 AI Core的矩阵计算单元计算
矩阵乘法计算的具体执行由软硬件协同完成。假设矩阵A和B都是16×16的方阵,那么矩阵C的256个元素可以由256个矩阵乘法子电路硬件在1个时钟周期完成计算。图1-13给出了矩阵A的第一行与矩阵B的第一列如何借助归约算法由矩阵乘法子电路完成点积操作,从而计算出矩阵C的第一行第一列元素的过程。当矩阵的尺寸超过16×16,则需要通过软件实现特定格式的数据存储和分块读取。
图1-13 矩阵计算单元电路
在深度学习中,同一个张量存在很多不同的存储格式。尽管存储的数据相同,但不同的存储顺序会导致数据的访问特性不同,因此即便进行同样的运算,相应的计算性能也会不同。在本小节中,我们首先介绍ND存储格式,随后介绍达·芬奇架构为了更高效地搬运和计算所采用的Nz存储格式。
(1)ND格式
一般来说,在计算机内存中,由于只能线性地存储数据,多维数组可以被看作一维数组的扁平化表示。
ND(N-Dimension)格式是深度学习网络中最常见、最基本的张量存储格式,代表N维度的张量数据。以一个矩阵为例,矩阵是二维张量,在这种格式下按照行主序进行存储,即张量中每一行(每一维)被依次存储在内存中,这意味着相邻的元素在内存中的地址是连续的。这种存储格式是目前很多编程语言中默认的方式,例如C++语言。
以下述矩阵为例:
其按照ND格式进行存储,结果如下:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]。
实际网络中会要求按照一定顺序存储多个矩阵数据,如图1-14所示。在这里可以按照深度学习领域中的惯例做出的抽象,其中N代表矩阵的个数,W代表矩阵的宽度,H代表矩阵的高度。
图1-14 存储多个矩阵的排布
上述数据按照ND格式进行存储的物理排布如下:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,…]。
先对一个矩阵进行行主序存储,接着再存储相邻的下一个矩阵,同样是进行行主序存储,直到存储完所有的数据。即此种方式先按W方向存储,再按H方向存储,最后按N方向存储,直到存储完所有数据。我们也称这种数据排布格式为NHW格式。
(2)Nz格式
为了更高效地搬运和进行矩阵计算,达·芬奇架构引入一种特殊的数据分形格式——Nz格式。
Nz格式的分形操作如下:整个矩阵被分为(H1×W1)个分形,按照列主序排布,即类比行主序的存储方式,列主序是先存储一列,再存储相邻的下一列,这样整体存储形状如N字形;每个分形内部有(H0×W0)个元素,按照行主序排布,形状如z字形。Nz格式的物理排列方式如图1-15所示。
图1-15 Nz格式的物理排列方式
下面展示一个分形内部有2×2个元素的实际数据样例,借此让读者更加直观地理解这种数据存储格式。如图1-16所示,这是一个按照Nz格式进行数据存储的样例,图中虚线箭头表示数据存储的顺序。
图1-16 Nz格式存储实际数据样例
上述数据按照Nz格式进行存储的物理排布如下:[0,1,4,5,8,9,12,13,2,3,6,7,10,11,14,15,16,17,20,21,…]。
首先对一个分形内部进行行主序存储,然后在一个完整矩阵中以分形宽度划分,进行列主序存储,最后依次对相邻的下一个矩阵进行存储。此方式先按W0方向存储,再按H0方向存储,接着按照H1方向存储,随后按照W1方向存储,最后按N方向存储,直到存储完所有数据。我们也称Nz数据排布格式为NW1H1H0W0格式,且由于其存储顺序形象展示为先“N”后“z”,故简称为Nz格式。
从ND格式转换为Nz格式,需要进行的操作是平铺、拆分及转置,这个转换过程示例如图1-17所示。
图1-17 ND格式转换为Nz格式的过程
读者也可以通过图1-18来直观感受从ND格式转换为Nz格式的过程。
图1-18 ND格式转换为Nz格式的直观流程
AI Core 的片上存储单元和相应的数据通路构成了存储系统。众所周知,几乎所有的深度学习算法都是数据密集型的应用。对于昇腾 AI 处理器的芯片来说,合理设计的数据存储和传输结构对于系统最终的运行性能至关重要。不合理的设计往往成为性能瓶颈,从而白白浪费了片上海量的计算资源。AI Core 通过各种类型的分布式缓冲区之间的相互配合,为深度神经网络计算提供了大容量和及时的数据供应,消除了数据流传输的瓶颈,从而实现了深度学习计算中所需要的大规模、高并发数据的快速和有效的提取与传输。
芯片中的计算资源要想发挥强劲算力,必要条件是保证输入数据能够及时、准确地出现在计算单元中。达·芬奇架构通过精心设计的存储单元确保了计算资源所需数据的供应,这样的存储单元相当于AI Core的后勤系统。如图1-19中虚线框包含的区域所示,AI Core的存储单元由存储控制单元(张量DMA和向量DMA)、缓冲区和寄存器(图中省略)组成。L1缓冲区(L1 Buffer)是矩阵计算模块中较大的一块数据中转区,暂存模块中需要反复使用的数据,以减少总线的数据搬运;张量DMA用于将数据从L1缓冲区搬运至L0缓冲区,其中L0A缓冲区和L0B缓冲区对应存储矩阵计算的输入,L0C缓冲区则对应存储矩阵计算的输出内容;UB是向量和标量计算输入和输出的存储位置;MBI用于和总线进行数据交互。此外,L2缓冲区(L2 Buffer)位于达·芬奇架构外,是矩阵计算模块和向量计算模块(AIV)共用的内存,未在图中展示。
图1-19 AI Core的存储单元
在AI Core的存储控制单元中,DMA用于数据搬运,一次既可以搬运一块连续的数据,也可以搬运带步长的数据。需要注意的是,用DMA搬运数据有一定的对齐要求。
DMA通过MBI不仅可以直接访问AI Core之外的更低层级的缓存,也可以通过DDR或HBM直接访问内存。DMA中还设置了存储转换单元,其目的是将输入数据转换成AI Core的各类型计算单元所兼容的数据格式。缓冲区包括用于暂存输入数据的L1缓冲区、矩阵计算单元的张量缓冲区,以及处于中心的用于暂存各种形式中间数据的UB。AI Core的各类寄存器资源主要被标量计算单元使用。
在AI Core中,通过精密的电路设计和板块组织架构的调节,在不产生板块冲突的前提下,无论是缓冲区还是寄存器都可以实现数据的单时钟周期访问。程序员可以通过底层软件显式地控制所有的缓冲区和寄存器的读写。有经验的程序员也可以通过巧妙的编程方式来防止存储单元中出现存储体冲突(bank conflict),以免影响流水线的进程。所谓存储体冲突,即当两个或更多的线程在同一时钟周期内尝试访问同一个存储体中的不同地址时,就会发生存储体冲突。由于每个存储体在一个时钟周期内只能服务一个线程,因此这些访问会被序列化,从而导致延迟。对于类似矩阵这样规律性极强的计算模式,高度优化的程序可以实现全程无阻塞的流水线执行。
MBI作为AI Core的“大门”,实现与系统总线交互,并与外部相连。AI Core通过MBI从外部L2缓冲区、DDR或HBM中读取或写回数据。MBI在这个过程中可以将AI Core内部发出的读写请求转换为符合总线要求的外部读写请求,并完成协议的交互和转换等工作。
输入数据从MBI读入后就会由存储转换单元进行处理。存储转换单元作为AI Core内部数据通路的传输控制器,负责AI Core内部数据在不同缓冲区之间的读写管理,以及完成一系列的格式转换操作,如补零、Im2Col、转置、解压缩等。存储转换单元还可以控制AI Core内部的L1缓冲区,从而实现局部数据的核内缓存。
在深度神经网络计算中,由于输入图像的特征数据通道众多且数据量庞大,往往会采用L1缓冲区来暂时保留需要频繁使用的数据,以达到节省功耗、提高性能的效果。当L1缓冲区被用来暂存使用率较高的数据时,就不需要每次通过MBI到AI Core的外部读取,从而在减少总线上数据访问频次的同时,降低了总线上产生拥堵的风险。在神经网络计算中,往往可以把每层计算的中间结果放在L1缓冲区中,从而在进入下一层计算时方便地获取数据。由于通过总线读取数据的带宽低、延迟大,如果充分利用L1缓冲区,就可以大大提升计算效率。另外,当存储转换单元进行数据的格式转换操作时,会产生巨大的带宽需求。达·芬奇架构要求源数据必须被存放于L1缓冲区中,这样才能够进行格式转换。在矩阵计算模块中,L1 缓冲区常用作输入缓冲区,它有利于将大量用于矩阵计算的数据一次性地搬运到 AI Core内部,同时利用固化的硬件极大地提升了数据格式转换的速度,避免了矩阵计算单元的阻塞,也消除了数据转换过程缓慢带来的性能瓶颈。
正如前文介绍AI Core中的计算单元时提到的那样,矩阵计算单元中的张量缓冲区就是专门为矩阵计算提供服务的。其中矩阵乘法的左矩阵数据、右矩阵数据,以及矩阵计算的最终结果或过往计算的中间结果都存放在张量缓冲区中。
AI Core 采用了片上张量缓冲区设计,从而为各类型的计算带来了更高的速率和更大的带宽。存储系统为计算单元提供源源不断的数据,高效适配计算单元的强大算力,从而综合提升了AI Core的整体计算性能。与谷歌张量处理器(Tensor Processing Unit,TPU)设计中的UB设计理念相类似,AI Core采用了大容量的片上缓冲区设计理念,通过增大片上缓存的数据量来减少数据从片外存储系统搬运到AI Core中的频次,从而可以降低数据搬运过程中的功耗,有效控制了计算的整体能耗。
达·芬奇架构通过存储转换单元中内置的定制电路,在进行数据传输的同时,就可以实现诸如Im2Col或其他类型的格式转换操作,不仅降低了格式转换过程中的消耗,也减小了数据转换的指令开销。这种能将数据在传输的同时进行转换的指令被称为随路指令。硬件单元对随路指令的支持为程序设计提供了便捷性。
数据通路指的是AI Core在完成一个计算任务时,数据在AI Core中的流通路径。前文已经以矩阵乘法为例简单介绍了数据的搬运路径。数据通路包含HBM和L2缓冲区,这些都属于AI Core的核外存储系统。
可以通过LOAD指令将核外存储系统中的数据搬运到矩阵计算单元中的张量缓冲区中进行计算,输出的结果也被保存在张量缓冲区中。除了直接将数据通过LOAD指令搬运到张量缓冲区,也可以通过LOAD指令将其先行搬运到L2缓冲区,再通过其他指令将其搬运到张量缓冲区中。这样做的好处是利用大容量的缓冲区来暂存需要被矩阵计算单元反复使用的数据。
在计算过程中,输入神经网络的数据往往种类繁多且数量巨大,如多个通道、多个卷积核的权重和偏置值,以及多个通道的特征值等。而AI Core中对应这些数据的存储单元相对独立且固定,并通过并行输入的方式来提高数据输入的效率,以满足海量计算的需求。AI Core中设计多个输入数据通路的好处是对输入数据流的限制少,能够为计算源源不断地输送源数据。与此相反,深度神经网络计算将多种输入数据处理完成后,往往只生成输出特征矩阵,数据种类相对单一。根据深度神经网络输出数据的特点,AI Core设计了单输出的数据通路,一方面节约了芯片硬件资源;另一方面可以统一管理输出数据,将数据输出的控制硬件降到最低。综上所述,达·芬奇架构中的各个存储单元之间的数据通路及多进单出的核内外数据交换机制,是研究人员在深入研究了以卷积神经网络为代表的主流深度学习算法后开发出来的,目的是在保障数据良好的流动性前提下,减少芯片成本、提升计算性能、降低系统功耗。
在达·芬奇架构下,控制单元为整个计算过程提供了控制指令,相当于AI Core的司令部,负责整个AI Core的运行,起到了至关重要的作用。控制单元的主要组成部分(如图1-20所示的虚线框部分)为系统控制模块、指令缓存模块、标量控制模块、矩阵指令队列模块、向量指令队列模块、存储转换指令队列模块和事件同步模块。
图1-20 AI Core的控制单元
在指令执行过程中,可以提前预取后续指令,并一次将多条指令读入缓存,以提升指令的执行效率。多条指令从系统内存通过MBI进入AI Core的指令缓存模块中,并等待后续硬件解码或计算。指令被解码后便会被导入标量控制模块的标量指令处理队列,实现地址解码与运算控制。这些指令包括矩阵计算指令、向量计算指令及存储转换指令等。所有指令都作为普通标量指令被逐条、顺次处理。标量指令处理队列将这些指令的地址和参数解码配置好后,分别发射到对应的指令执行队列中,而标量指令会驻留在标量指令处理队列中等待后续执行。指令执行队列由矩阵指令队列、向量指令队列和存储转换指令队列组成。矩阵计算指令进入矩阵指令队列,向量计算指令进入向量指令队列,存储转换指令进入存储转换指令队列,同一个指令执行队列中的指令按照进入队列的顺序执行,不同指令执行队列之间可以并行执行。通过多个指令执行队列的并行执行可以提升整体执行效率。
如果指令执行队列中的指令到达队列头部,就进入真正的指令执行环节,并被分发到相应的执行单元中,如矩阵计算指令被发射到矩阵计算单元,存储转换指令被发射到存储转换单元。不同的执行单元可以并行地按照指令进行计算或处理数据。同一个指令队列中指令执行的流程被称为指令流水线。
对于指令流水线之间可能出现的数据依赖,达·芬奇架构的解决方案是通过设置事件同步模块统一、自动协调各个流水线的进程。事件同步模块时刻控制每条流水线的执行状态,并分析不同流水线的依赖关系,从而解决数据依赖和同步的问题。例如矩阵指令队列的当前指令需要依赖向量计算单元的结果,在执行过程中,事件同步模块会暂停矩阵指令队列的执行流程,要求其等待向量计算单元的结果。当向量计算单元完成计算并输出结果后,事件同步模块通知矩阵计算队列需要的数据已经准备好,可以继续执行。在事件同步模块准许放行之后,矩阵指令队列才会发射当前指令。
图1-21展示了4条指令流水线的执行流程。标量指令处理队列先执行标量指令0、标量指令1和标量指令2。由于向量计算队列中指令0和存储转换队列中指令0与标量指令2存在数据依赖性,需要等到标量指令2完成后才能发射并启动。受到指令发射窗口资源限制的影响,一次只能发射两条指令,因此只能在时刻4时发射并启动矩阵计算指令0和标量指令3,这时4条指令队列可以并行执行。直到标量指令处理队列中的全局同步标量指令7生效后,由事件同步模块对矩阵流水线、向量流水线和存储转换流水线进行同步控制,并等待矩阵计算指令0、向量计算指令1和存储转换指令1都执行完成后,得到执行结果,事件同步模块控制作用完成,标量流水线继续执行标量指令8。
图1-21 4条指令流水线的执行流程
对于同一条指令流水线内部指令之间的依赖关系,达·芬奇架构是通过事件同步模块自动实现同步的。在遇到同一条流水线内需要处理关系时,事件同步模块阻止同一指令执行队列中后续指令的执行,直到能够满足某些条件之后才恢复执行。在达·芬奇架构中,无论是流水线内部的同步还是流水线之间的同步,都是通过事件同步模块进行控制的。
在控制单元中还存在一个系统控制模块。在AI Core运行之前,需要外部的任务调度器,也就是一个独立CPU来控制和初始化AI Core的各种配置接口,如指令信息、参数信息及任务块信息等。这里的任务块是指AI Core中最小的计算任务粒度。在配置完成后,系统控制模块会控制任务块的执行进程;在任务块执行完成后,系统控制模块会进行中断处理和状态申报。如果在执行过程中出现了错误,系统控制模块会把执行的错误状态报告给任务调度器,进而将当前AI Core的状态信息反馈给整个昇腾AI处理器芯片系统。
任何程序在处理器芯片中执行计算任务时,都需要通过特定的规范转换成硬件能够理解并执行的语言,这种语言被称为指令集架构(Instruction Set Architecture,ISA),简称指令集。指令集包含数据类型、基本操作、寄存器、寻址模式、数据读写方式、中断、异常处理及外部I/O等,每条指令都描述处理器的一种特定功能。指令集是计算机程序能够调用的处理器全部功能的集合,是处理器功能的抽象模型,也是计算机软件与硬件的接口。
指令集可以分为精简指令集(Reduced Instruction Set Computer,RISC)和复杂指令集(Complex Instruction Set Computer,CISC)。精简指令集的特点是单指令功能简单、执行速度快、编译效率高,不能直接操作内存,仅能通过指令(LOAD/STORE指令)来访问内存。常见的精简指令集有ARM、MIPS、OpenRISC及RSIC-V等。复杂指令集的特点是单指令功能强大且复杂,指令执行周期长,并可以直接操作内存。常见的复杂指令集如x86。
昇腾AI处理器芯片有一套专属的指令集,其设计介乎于精简指令集和复杂指令集之间,包括标量指令、向量指令、矩阵指令和存储转换指令等。标量指令类似于精简指令集,而矩阵指令、向量指令和存储转换指令类似于复杂指令集。昇腾AI处理器芯片指令集结合精简指令集和复杂指令集两者的优势,在实现单指令功能简单和速度快的同时,对于内存的操作也比较灵活,搬运较大数据块时的操作简单、效率较高。
标量指令主要由标量计算单元执行,主要目的是为向量指令和矩阵指令配置地址及控制寄存器,并对程序执行流程进行控制。标量指令还负责对L1缓冲区和UB中的数据进行存储和加载、简单的数据运算等操作。标量指令完成的功能与CPU的功能类似,包括算术运算(Add、Sub、Max、Min)、比较与选择(CMP、SEL)、逻辑运算(AND、OR、XOR)、数据搬运(MOV、LOAD、STORE)和流程控制(JUMP、LOOP)5类指令。
向量指令由向量计算单元执行。每个向量指令可以完成多个操作数的同一类型运算,但参与运算的输入数据必须已经在 UB 中,否则需要通过向量 DMA 从板外搬运至板上的 UB,如果要将运算后的结果搬出板外,也需要由向量 DMA 完成。向量指令类似于传统的单指令多数据(Single Instruction Multiple Data,SIMD)指令,在CPU指令中也相继引入了流SIMD扩展(Streaming SIMD Extensions,SSE)系列、高级向量扩展(Advanced Vector Extensions,AVX)系列指令。2013年发布的AVX-512指令集,其指令宽度扩展到512位。昇腾AI处理器的向量指令支持的数据类型为FP16、FP32和int32,一次可以执行2048位向量计算(等价于128个FP16类型的计算)。
昇腾AI处理器的向量指令包括5种类型:算术运算指令、比较与选择指令、逻辑运算指令、数据搬运指令及其他专用指令。其中常见的算术运算指令有加法(Vadd)、减法(Vsub)、求最大(Vmax)和求最小(Vmin);比较与选择指令有向量比较大小(Vcmp)和选择(Vsel);逻辑运算指令有向量与(Vand)和向量或(Vor)。昇腾 AI 处理器的向量指令支持多次迭代执行,也支持直接运算带有间隔(Stride)的向量。
矩阵指令由矩阵计算单元执行,实现高效的矩阵乘法计算和累加操作C=A×B+C。在神经网络计算过程中,矩阵A通常代表输入特征矩阵,矩阵B通常代表权重矩阵,矩阵C通常代表输出特征矩阵。矩阵指令支持int8和FP16类型的输入数据,也支持int32、FP16和FP32类型的输出数据。在矩阵指令执行前,数据同样被搬运至板上,随后根据左、右矩阵的差异被搬运至L0A缓冲区和L0B缓冲区中,并在执行计算时被搬入矩阵计算单元中参与矩阵计算,并将结果返回至L0C缓冲区,最后被搬运回板外。正如前文所介绍,矩阵计算单元支持一次计算两个大小不超过16×16、数据类型为FP16的矩阵乘法。
扫码观看视频
硬件感知(Hardware Perception)是一种设计原则,通过在软件中设立接口,在开发者进行开发时能实时检测硬件参数状况,如获取处理器的核数、芯片的版本信息、硬件存储空间的大小、硬件存储空间的带宽大小等信息。
开发者在使用Ascend C进行编程时,可能需要获取一些硬件平台的信息,如获取硬件平台的核数等。PlatformAscendC 类提供获取这些平台信息的功能。使用该功能需要包含“tiling/platform/platform_ascendc.h”头文件。PlatformAscendC 类提供了如下接口,能实现对应的获取硬件平台信息的功能。
● GetCoreNum:获取AI Core的数量。
● GetSocVersion:获取当前硬件平台的版本信息。
● GetCoreNumAic:获取当前硬件平台矩阵计算单元的核数信息。
● GetCoreNumAiv:获取当前硬件平台向量计算单元的核数信息。
● CalcTschBlockDim:计算底层任务调度的核数。
● GetCoreMemSize:获取硬件平台存储空间的内存大小。
● GetCoreMemBw:获取硬件平台存储空间的带宽大小。
一个实际的调用样例如程序清单1-1所示。清单中第1行引入了使用Ascend C进行硬件感知所需的头文件。第2~12行定义了一个需要进行硬件感知的函数:其中第3行调用GetPlatformInfo()函数获取platformInfo结构体的信息;第4~6行定义了两个64位无符号整型数据ub_size和l1_size,并通过调用GetCoreMemSize()函数获取UB和L1缓冲区的硬件存储空间大小的数据存储在ub_size和l1_size中;第7~8行通过调用GetCoreNumAic()函数和GetCoreNumAiv()函数分别获取当前硬件平台矩阵计算单元和向量计算单元的数量;第10行首先通过调用CalcTschBlockDim()函数计算底层任务调度的核数,该函数第一个入参的含义为数据切分的份数,后续两个入参分别表示当算子使用了矩阵计算API或向量计算API时显示的对应的核数,否则为0。
程序清单1-1 使用PlatformAscendC类的样例代码
1 #include "tiling/platform/platform_ascendc.h"
2 ge::graphStatus TilingXXX(gert::TilingContext* context) {
3 auto ascendcPlatform = platform_ascendc::PlatformAscendC(context->
GetPlatformInfo());//获取platformInfo结构体的信息
4 uint64_t ub_size, l1_size;
5 ascendcPlatform.GetCoreMemSize(platform_ascendc::CoreMemType::UB, ub_size);
6 ascendcPlatform.GetCoreMemSize(platform_ascendc::CoreMemType::L1, l1_size);
//获取硬件存储空间大小的数据
7 auto aicNum = ascendcPlatform.GetCoreNumAic();
8 auto aivNum = ascendcPlatform.GetCoreNumAiv();//获取当前硬件平台矩阵计算单元和
//向量计算单元的数量
9 //其他操作
10 context->SetBlockDim(ascendcPlatform.CalcTschBlockDim(aivNum, aicNum,
aivNum)); //计算底层任务调度的核数
11 return ret;
12 }
扫码观看视频
昇腾异构计算架构(Compute Architecture for Neural Networks,CANN)是专门为满足高性能深度神经网络计算需求所设计并优化的一套架构。在硬件层面,昇腾 AI 处理器所包含的达·芬奇架构实现对计算资源的定制化设计,在功能实现上进行深度适配,为深度神经网络计算性能的提升提供了强大的硬件基础。在软件层面,CANN所包含的软件栈则提供了管理网络模型、计算流及数据流的功能,支持深度神经网络在异构处理器上的执行。
昇腾异构计算架构如图1-22所示。CANN作为昇腾AI处理器的异构计算架构,支持业界多种主流的AI框架,包括MindSpore、TensorFlow、PyTorch、Jittor等。Ascend C算子开发语言开放全量底层API,帮助开发者完成高性能自定义算子开发;同时开放高层API,降低开发难度,帮助开发者快速实现复杂的自定义算子开发。图引擎(Graph Engine,GE)包括图优化、图编译、图执行等,便于开发者使用,优化了整网性能。华为集合通信库(Huawei Collective Communication Library,HCCL)可供开发者直接调用,以改善网络拥塞,提升了网络资源利用率和运维效率。算子加速库(Ascend Operator Library,AOL)提供对外开放的基础算子和大模型融合算子API,供开发者直接调用,优化了大模型性能。运行时将硬件资源(计算、通信、内存管理等资源)的API对外开放,满足开发者对模型开发、系统优化、第三方AI框架对接等不同场景诉求。
图1-22 昇腾异构计算架构
本章介绍了昇腾AI处理器的软硬件架构。首先介绍了Atlas硬件计算平台及昇腾AI处理器;随后着重讲解了达·芬奇架构和硬件感知,包括计算单元、存储系统、控制单元和指令集设计的相关功能;最后介绍了CANN这一专为满足高性能深度神经网络计算需求所设计的异构计算架构,对Ascend C在整个架构中的位置和作用进行了特别说明。
下一章将介绍并行计算的基本原理,以帮助读者快速了解Ascend C算子调用的过程。同时围绕实际例子,展示使用Ascend C算子加速计算任务的效果,并初步实现算子的调用和算子的自定义。
1.NPU的加速计算核心是哪个?( )
A.AI CPU
B.AI Core
C.DDR/HBM
D.DVPP
2.[多选]AI Core的核心单元包含下面哪些?( )
A.计算单元
B.存储单元
C.控制单元
D.同步单元
3.有如下6个矩阵,其在ND格式下的内存排布和在Nz格式(H0=3,W0=2)下的内存排布是什么?( )
[1,2,3,4]
[5,6,7,8]
[9,10,11,12]
[13,14,15,16]
[17,18,19,20]
[21,22,23,24]
A.ND:1,2,5,6,9,10,3,4,7,8,11,12,13,14,17,18,21,22,15,16,19,20,23,24
Nz:1,2,5,6,9,10,13,14,17,18,21,22,3,4,7,8,11,12,15,16,19,20,23,24
B.ND:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
Nz:1,2,5,6,9,10,13,14,17,18,21,22,3,4,7,8,11,12,15,16,19,20,23,24
C.ND: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
Nz:1,5,9,2,6,10,3,7,11,4,8,12,13,17,21,14,18,22,15,19,23,16,20,24
D.ND:1,2,5,6,9,10,13,14,17,18,21,22,3,4,7,8,11,12,15,16,19,20,23,24
Nz:1,2,5,6,9,10,13,14,17,18,21,22,3,4,7,8,11,12,15,16,19,20,23,24
4.下面哪种存储设计为AI Core的计算单元带来了更高的速率和更大的带宽?( )
A.片上张量缓冲区
B.MBI
C.外部L2缓冲区
D.DDR/HBM
了解你的计算设备。请借助 PlatformAscendC 类提供的接口编程来获取硬件平台的信息,包括但不限于如下硬件信息:当前硬件平台的版本及型号、硬件平台矩阵计算单元的核数、硬件平台存储空间的带宽大小等。