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

    文章

    18275

    浏览量

    222163
  • 存储器
    +关注

    关注

    38

    文章

    7148

    浏览量

    161986
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32392
收藏 人收藏

    评论

    相关推荐

    云计算、大数据处理技术交流

    云计算、大数据处理技术交流图形图像是数据处理量最大的版块之一,也是当今云计算的重要课题之一,图形图像处理大会给大家带来诸多名家方案,探究大数据图像图形
    发表于 09-16 14:18

    浅谈大数据视频图像处理系统技术

    浅谈大数据视频图像处理系统技术近年来,随着计算机、网络以及图像处理、传输技术的飞速发展,视频监控系统正向着高清化、智能化和网络化方向发展。视频监控系统的高清化、智能化和网络化为视频监控图像处理
    发表于 09-24 15:22

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

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

    轻松学会单片机

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

    如何利用单片机高效地并行处理多个外设通信?

    现在写代码一直会遇到这样的问题:单片机在处理某一个外设请求的时候,如何兼顾到其他的外设请求,简而言之就是单片机如何能高效地并行处理多个外设通信。不带操作系统。比如:指纹模块和ZIGBEE模块。单片机
    发表于 10-14 22:10

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

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

    如何实现灵活高效的多媒体信号处理

    如何利用可编程逻辑实现灵活高效的多媒体信号处理
    发表于 06-02 07:25

    从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

    s32k144关于VLPS->RUN模式转换后Cache操作的问题求解

    我在重置后使用下面的 cmd 使用缓存启用。LMEM->PCCRMR = 0x80000000U;/*只有R0区域可缓存*/ LMEM->PCCCR = 0x85000001U;其他
    发表于 03-23 07:36

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

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

    钡铼技术R40网关与华为云IoT平台对接,实现高效数据传输与处理

    钡铼技术R40网关与华为云IoT平台对接,实现高效数据传输与处理
    的头像 发表于 08-31 15:05 389次阅读
    钡铼技术R40网关与华为云IoT平台对接,实现<b class='flag-5'>高效</b><b class='flag-5'>数据</b>传输与<b class='flag-5'>处理</b>