0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何高效处理LMEM中的数据?这篇文章带你学会!

算能开发者社区 2024-01-19 08:33 次阅读

Weight Reorder是TPU-MLIR的一个pass(参考TPU-MLIR编译流程图),其完成了对部分常量数据的Layout变化和合并。本文介绍其中Convlotion Kernel的Reorder行为以及合并Bias机制,帮助大家理解Conv2D.cpp代码中的原理。

在SOPHON硬件中,存储单元多种多样,包括LMEM(本地存储器)、SMEM(静态SRAM)和GMEM(全局存储器,即片外DDR存储)。其中,LMEM作为一种高速SRAM,因其靠近执行单元(EU)而提供了高带宽和低延迟的访问特性。为了实现这种高速访问,SOPHON BM1684X处理器将LMEM划分为64个分区,每个分区均可由相应的NPU单元独立访问。每个NPU包含多个EU,并且在不同的计算类型下,EU处理的数据各不相同。NPU无法跨分区访问数据。下图展示了这种结构的概览。6da8586a-b662-11ee-aa22-92fbcf53809c.png

64个分区的地址是连续编码的,即第一个分区的下一个地址便是第二个分区的起始地址。为了简化编程,SOPHON定义了数据在LMEM中的布局(Layout)。为了更直观地描述这种布局,本文将采用numpy中的ndarray形式来演示,并使用numpy定义的操作来说明数据在存储器中的布局与神经网络中定义的数据存在的差异。

本文涉及的ndarray操作包括reshape和transpose,并定义了一个resize函数来整理数据布局。resize函数可以对数据的指定维度进行扩展。例如:

tensor_a.shape=(1,2,3,4)#对应于d0=1,d1=2,d2=3,d3=4
tensor_b=resize(tensor_a,(2,4,3,8))

此时,在d0、d1、d3维度上使用0进行填充,以达到最终尺寸。

In[1]:tensor_a
Out[1]:
array([[[[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9,10,11]],

[[12,13,14,15],
[16,17,18,19],
[20,21,22,23]]]])

In[2]:resize(tensor_a,(1,3,3,6))
Out[2]:
array([[[[0, 1, 2, 3, 0, 0],
[4, 5, 6, 7, 0, 0],
[8, 9,10,11, 0, 0]],

[[12,13,14,15, 0, 0],
[16,17,18,19, 0, 0],
[20,21,22,23, 0, 0]],

[[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]]])

resize函数的一个参考实现如下:

defresize(src,shape):
out=np.zeros(shape,dtype=src.dtype)
_src_slice=tuple(slice(0,min(i,j))fori,jinzip(src.shape,shape))
out[_src_slice]=src
returnout

LMEM中四维数据的排布

在LMEM中,一个四维数据(n,c,h,w)的Channel维度会被分散到不同的lane上。以一个shape为(2,5,2,3)的数据为例,假设NPU数量为4,每个NPU中EU数量为4,并且数据在h,w维度上需要与EU对齐:

shape=(2,5,2,3)
a=np.arange(np.prod(shape)).reshape(shape)

6dbc2818-b662-11ee-aa22-92fbcf53809c.png

b=a.reshape(2,5,6)#数据hw合并
b=(
resize(b,(2,8,8)) #channel对齐到NPU,hw对齐到EU
.reshape(2,2,4,2,4)
.transpose(2,0,1,3,4)#(4,2,2,2,4)<- (npu_id, n^, c^, h^, w^)
)

其中(n^, c^, h^, w^)为每个lane上数据的实际shape,对应的stride也满足处理器中的定义。可以参考TPUKernel用户开发手册中的描述。npu_id维度是一个隐含维度,其值为npu数量,此处为4。

6dbc2818-b662-11ee-aa22-92fbcf53809c.png在4个NPU上对齐EU的数据排列

卷积权重的排列

为了确保EU能够高效地使用,BM1684X处理器中卷积的权重需要按照EU对齐的方式优先存储IC维度的数据,然后将OC维度分布到不同的NPU上。相应的存储方式可以表示为:

c=a.reshape(2,5,6)
c=(
resize(c,(1*4,2*4,6)) #npu,eu_align,h*w
.reshape(1,4,2,4,6)
.transpose(1,0,2,4,3) #<4x1x2x6x4>
)

6dd8092a-b662-11ee-aa22-92fbcf53809c.png卷积权重的存储方式

卷积权重与偏置的合并

在BM1684X中,权重需要按照EU对齐方式存储,而偏置则采用紧凑模式。由于偏置数据量较小,直接拷贝效率不高。因为两种模式下数据的stride不一致,无法直接将它们拼接在一起。在TPU-MLIR中,通过预先将权重和偏置合并,形成最终在LMEM中的存储形式,然后通过一条DMA指令直接加载到LMEM中。

d=np.arange(60,65).reshape(1,5,1,1)
d=(
resize(d,(1,2*4,1,1)) #npu,eu_align
.reshape(1,2,4,1,1)
.transpose(2,0,3,4,1) #<4x1x1x1x2>
.resize(4,1,2,1,4)#EUalign<4x1x1x1x4>
)
e=np.concatenate((d.reshape(4,1,4),c.reshape(4,12,4)),axis=1)

6de437b8-b662-11ee-aa22-92fbcf53809c.png卷积权重和偏置合并后的形式

通过上述方法,我们可以有效地组织LMEM中的数据,以适应SOPHON BM1684X处理器的计算需求,从而提高整体的执行效率和性能。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19281

    浏览量

    229779
  • 存储器
    +关注

    关注

    38

    文章

    7490

    浏览量

    163817
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32868
收藏 人收藏

    评论

    相关推荐

    康谋分享 | 如何应对ADAS/AD海量数据处理挑战?

    如何有效处理ADAS/AD海量数据并从中获得见解?IVEX数据处理流程可自动从原始传感器数据等输入识别出值得关注的事件和场景,推动
    的头像 发表于 12-25 10:05 519次阅读
    康谋分享 | 如何应对ADAS/AD海量<b class='flag-5'>数据处理</b>挑战?

    学会NI-DAQmx的十个函数解决80%的数据采集应用问题

    学会NI-DAQmx的十个函数解决80%的数据采集应用问题
    发表于 01-12 22:16

    轻松学会单片机

    电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理
    发表于 09-14 10:51

    带你分析图像传感器与软件图像处理流水线

    一篇文章带你分析图像传感器与软件图像处理流水线。
    发表于 04-27 06:28

    从0开始,181页知识带你轻松搞定C++语言

    擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。 这个资料带你从最基础开始了解学习C++,
    发表于 07-24 13:10

    如何处理好FPGA设计跨时钟域间的数据

    跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课。如果是还是在校的学生,跨时钟域处理也是面试中经常常被问到的一个问题。在本篇
    发表于 07-29 06:19

    教你怎样学会PID调参

    不会PID调参?这篇文章图文结合带你学会PID调参!让你成为PID调参大神!!!
    发表于 01-06 07:47

    带你玩转RT-Thread,开发教程汇总(共13篇)

    本教程带你手把手带你学会玩转RT-Thread,从RT-Thread的内核到外设、传感器、组件包,应用开发,让对于刚刚接触使用RTT的你不再胆怯,开心玩耍RT-Thread!本教程使用的开发板:正点原子-战舰V3.0 型号:st
    发表于 05-11 14:10

    带你深入探索okio组件高效的奥秘

    。中间多次拷贝,降低了IO效率,同时增加了系统消耗。为了满足开发者对IO的更高要求,三方组件库推出IO处理利器——okio(JS版本)。okio使用Segment作为数据存储容器,通过提供Segment
    发表于 07-08 14:43

    无法让SWO数据在MCUXpresso上高效工作怎么处理

    我正在使用 IMXRT-1061/1062 进行项目 我试图让 SWO 数据在 MCUXpresso 上高效工作,但没有成功。 设置配置: 从 MCUXpresso 11.5.0 转移到
    发表于 06-02 06:59

    基于ARM处理器的高效异常处理解决方案

    。测试结果表明,该方案的异常处理更为高效。 在航空航天、工业控制及医疗等领域中,嵌入式系统的安全性、可靠性以及高效性作用显著,而异常是系统在运行过程的突发事件,异常
    发表于 02-03 03:38 1407次阅读
    基于ARM<b class='flag-5'>处理</b>器的<b class='flag-5'>高效</b>异常<b class='flag-5'>处理</b>解决方案

    关于选择处理器的八个认知错误

     我们购买电脑,往往会关心处理器的性能好坏,处理器的性能好坏直接影响了电脑的运算速度,我们可以将处理器比喻成大脑,是计算机的核心,决定了电脑速度好坏。那么如何选购处理器呢?今天小编分享
    发表于 05-20 09:23 849次阅读

    Python数据清洗和预处理入门完整指南

    凡事预则立,不预则废,训练机器学习模型也是如此。数据清洗和预处理是模型训练之前的必要过程,否则模型可能就「废」了。本文是一个初学者指南,将带你领略如何在任意的数据集上,针对任意一个机器
    的头像 发表于 12-21 13:50 881次阅读

    labview处理excel数据的粗大误差

    实际应用,我们经常需要处理和分析来自不同来源的数据。其中,Excel表格是一个常见的数据格式,因为它易于使用和管理。然而,Excel数据
    的头像 发表于 01-05 16:15 918次阅读

    盛显科技:拼接处理器如何实现高效数据拼接操作?

    众所周知,高效数据拼接操作无疑是数据处理领域的核心优势,它能极大地缩短了处理时间,让拼接处理器能够迅速应对海量
    的头像 发表于 10-23 10:58 244次阅读
    盛显科技:拼接<b class='flag-5'>处理</b>器如何实现<b class='flag-5'>高效</b><b class='flag-5'>数据</b>拼接操作?