打开微信,使用扫一扫进入页面后,点击右上角菜单,
点击“发送给朋友”或“分享到朋友圈”完成分享
本次直播分为【功能篇】和【性能篇】两部分
【功能篇】:介绍基于BANG异构计算平台在NLU硬件的开发实践技巧
【性能篇】:如何使用CNToolkit对BANG3.0开发的程序进行性能优化
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都会有一个最低版本依赖,除了软件运行时会检查,用户可以查看手册:
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
热门帖子
精华帖子