×

签到

分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

MLU370— BANG 3.0 编程优化直播课【FAQ合集】 三叶虫2022-11-22 16:35:54 回复 6 查看 技术答疑
MLU370— BANG 3.0 编程优化直播课【FAQ合集】
分享到:

直播课简介:

BANG编程最佳实践系列——BANG 3.0 编程优化

本次直播分为【功能篇】和【性能篇】两部分

【功能篇】:介绍基于BANG异构计算平台在NLU硬件的开发实践技巧

【性能篇】:如何使用CNToolkit对BANG3.0开发的程序进行性能优化


回看链接:

【MLU370系列开发实战直播课】BANG编程最佳实践系列——BANG 3.0 编程优化_哔哩哔哩_bilibili

其余两节直播链接:

【MLU370系列开发实战直播课】Cambricon Pytorch应用实战_哔哩哔哩_bilibili

【MLU370系列开发实战直播课】Cambricon MagicMind编程技术实战_哔哩哔哩_bilibili


BANG 3.0 编程优化【FAQ合集】

Q1:

BANG3.0、2.0、1.0分别是什么含义?有什么区别和联系吗?

BANG C 和 BANG PY二者在功能上有什么区别吗?

A1:

BANG是对MLU硬件抽象的软件计算架构或平台,软件自身有迭代的版本号。BANG 1.0可以支撑MLU100系列硬件产品;BANG 2.0可以支撑包含MLU100和MLU200系列硬件产品;BANG 3.0可支撑MLU300系列和MLU200系列的硬件产品。

BANGPy是对BANG异构计算的Python封装,BANGPy通过JIT编译后会生成BANG C代码,所以对MLU计算能力的表达基本是一致的, BANGPy比BANG C好的地方是Python语言的易用性,屏蔽了一些BANG C Buitlin接口上的硬件相关细节,比BANG C差的损失了C/C++语言编程的底层灵活性和极致性能优化

 

Q2:

CNCC目前有SYCL支持吗?

A2:

CNCC当前不支持SYCL标准,但公司当前有和高校科研单位合作支持SYCL

 

Q3:

block和union分别指的是什么?

A3:

Kernel函数启动时指定的任务类型,block任务可简化看做一个Kernel在一个MLU Core上执行一次,union任务可看做一个Kernel同时在一个MLU Cluster上执行一次,union任务的Kernel内代码可以使用多Core共享的SRAM存储

 

Q4:

BANG和openCL有什么异同吗?编程方式上和openCL区别大吗?

A4:

BANG是为了专门支持MLU硬件而定制的异构并行计算平台,openCL是一种开放标准,支持多家的GPU架构,BANG C和CUDA C更像,在异构并行大的编程模型上和openCL有类似之处,但代码整体差异很大

 

Q5:

MLU270的算子可以在MLU370上直接编译运行吗?

A5:

MLU270上的开发的BANG C源码,如果没有用到MLU370系列或者BANG 3.0提供的API,在重新编译后就可以运行了

 

Q6:

已有的CUDA 算子实现,有脚本可以一键转换到BANG Kernel吗?

A6:

不支持,但公司在预研类似CUDA转HIP的工具

 

Q7:

MLUv3需要考虑数据对齐吗?

A7:

MLUv2硬件的IO已经没有对齐约束,计算有对齐约束,MLUv3及以后得硬件都不需要对齐

 

Q8:

怎么保证多个并行任务的同步性?

A8:

Kernel在Queue内部是保序执行的,即KernelA所有的Block或Union都执行完毕,KernelB才会执行;

Block类型的并行任务直接无法同步,数据交互需要使用Atomic指令,Union1类型的并行任务,使用__sync_cluster()接口同步一个cluster,Union2/4/8的并行任务使用__sync_all()同步当前所有的cluster

 

Q9:

用BANG语言写的算子加速效果如何,一定比在CPU上性能更好吗,难集成吗?

A9:

在并行加速和AI加速的运算上,MLU相比CPU有非常显著的性能和能效优势。BANG开发的算子集成难度等价于cuDNN算子的集成难度

 

Q10:

BANG的运行时和硬件驱动会有一定的对应?

A10:

CNRT和CNDrv等运行时库所属的CNToolkit对Driver都会有一个最小版本依赖检查,某一款硬件搭配Driver和CNToolkit使用,对Driver和CNToolkit都会有一个最低版本依赖,除了软件运行时会检查,用户可以查看手册:

《寒武纪CNToolkit安装升级使用手册》

《驱动安装手册》

 

Q11:

现在GPU会引入SPIR-V作为kernal的中间表示,在运行时再推给硬件驱动做最后编译,寒武纪有这种类似的方式吗?

A11:

MLU当前不支持SPIR-V这层IR,但从BANG C到硬件二进制有其他层次的编译IR:MLVM(LLVM IR)、MLISA(类似PTX的虚拟指令集)

 

Q12:  

BANG编译时指定异构代码要跑在哪个硬件设备上吗?

A12:

指定某一款ISA的编译选项为cncc --bang-mlu-arch=mtp_270/mtp_372

指定某一代架构的编译选项为cncc --bang-arch=comput_20/compute_30

 

Q13:

比如程序里边的多个kernel要分别跑在你们三种型号的卡上,那编译的时候要指定这三个型号,那每个kernel都要编译三份?还是在代码中要指定这个kernel要跑在哪块卡上,然后编译器为它编译到相应卡的二进制?

A13:

这个问题可以参考《Cambricon BANG C/C++ 编程指南》了解cncc的异构混合编译流程,也可以参考CNToolkit安装后的samples,路径为/usr/local/neuware/samples/BANG

举例子有个Kernel叫foo,保存在foo.mlu文件中,假设希望编译出的二进制同时支持MLU270/MLU290/MLU370,那么编译时指定多个架构

cncc --bang-mlu-arch=mtp_270 --bang-mlu-arch=mtp_290 --bang-mlu-arch=mtp_372 -fPIC -c foo.mlu -o foo.o

那么foo.mlu会用三个架构选项分别编译成cnbin并合并为cnfatbin保存在foo.o中,foo.o可以和CPU端的二进制使用gcc链接,假设当前在MLU370卡上执行了foo<<<>>>()函数调用,CNRT会根据当前硬件型号解析cnfatbin从中选择mtp_372架构的cnbin执行

 

Q14:

有没有一些封装好的高级API,通过简单组合来完成算子kernel的实现呢?

A14:

当前BANG 3.0版本开放的还是一些Builtin级别的API,除此之外还有Libdevice级别的API可用,比较高级语义的 API,届时会在寒武纪开发者社区和论坛公开,敬请关注

 

Q15:

请教片上的两种RAM有多大?

A15:

NRAM、WRAM、SRAM的地址空间在寒武纪MLU架构调优文档中有详细介绍,请点击阅读:《寒武纪MLU架构调优指南》 ,cncc提供了如下编译宏来获取大小:

__MLU_NRAM_SIZE__、__MLU_WRAM_SIZE__、__MLU_SRAM_SIZE__

 

Q16:

请问能介绍一下关于带宽竞争相关的问题吗?比如MPU和4个IPU同时访问GDRAM。还有GDRAM<-->SRAM的数据拷贝速度与GDRAM<-->NRAM的数据拷贝速度相比结果怎么样呢?

A16:

典型场景是DDR总带宽被多个IPU同时抢占时肯定会有竞争问题,所以如果Cluster内4个IPU读取了相同的数据,可以使用Cluster内的MPU读取到SRAM后,让4个IPU从SRAM上读取,既减少了DDR读取的竞争,又充分利用了片上的带宽

GDRAM-SRAM之间和GDRAM-NRAM之间带宽和延迟是相同的,因为都受制于DDR控制器,使用SRAM提升性能的点在于减少了相同数据的读取,并充分利用了片上IO的高带宽和低延迟

 

Q17:

BANGPy开发的算子和BANG C开发的算子执行效率有什么区别?

A17:

基本没有区别,底层都会使用相同的LLVM后端和MLISA汇编

 

Q18:

请问优化在O0到O3以及OS有什么区别吗?

A18:

参考gcc的O0到O3、Os,O3最激进性能最好,Os用来优化代码体积

和gcc的差异是,cncc的优化等级会传递给cnas,cnas在汇编阶段会做O0到O3的优化

 

Q19:

哪里有入门级的sample可以参考学习吗?

A19:

可以参考:Cambricon BANG C/C++ 编程指南》

CNToolkit安装后的samples:/usr/local/neuware/samples/BANG



版权所有 © 2024 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭