OrangePi AIpro 香橙派 昇腾 Ascend C算子开发 - NCHW和NHWC格式在内存中的存储方式及遍历方法
flyfish
从计算机硬件的角度来看,内存本质上是线性的一维数组 。尽管在编程时可以使用多维数组或更复杂的数据结构,但这些多维数据最终都被线性化存储在内存中。
内存的本质是线性的一维地址空间
计算机的物理内存可以理解为一个连续的、线性的字节数组,每个字节都有唯一的地址。这个地址是从 0 开始一直递增到内存的最大可用地址。这些地址的集合形成了一个一维的地址空间 ,即每个存储单元都有一个唯一的地址,它们是线性排列的。虽然编号从0(在32位系统中是从0x00000000开始)开始,但有些特殊的地址可能会被系统保留,用于硬件操作或其他目的。
因此,无论数据结构有多复杂,例如二维数组、三维张量或者更复杂的树或图结构,它们最终都会通过特定的地址映射规则存储在这个线性的一维内存空间中。
多维数据结构的内存线性化
多维数据结构,比如二维、三维数组,在内存中存储时会被"线性化"。也就是说,这些多维结构的数据会按照一定的规则映射到一维的内存地址空间中。
举个例子,假设有一个二维数组:
int array[3][4]; // 3行4列的二维数组
尽管它是一个二维数组,但在内存中,它实际上是按行存储的线性数组:
Row 0: array[0][0], array[0][1], array[0][2], array[0][3]
Row 1: array[1][0], array[1][1], array[1][2], array[1][3]
Row 2: array[2][0], array[2][1], array[2][2], array[2][3]
内存中存储顺序是:array[0][0]
, array[0][1]
, …, array[2][3]
。它们以线性顺序依次排列在一维的内存空间中。
当处理 RGB 图像数据时,通常有三种通道:红色(R)、绿色(G)和蓝色(B)。图像数据的存储方式可以是 NHWC
或 NCHW
格式。
1. NCHW 格式存储方式
NCHW
格式表示数据存储的顺序是:批次(N),通道(C),高度(H),宽度(W)。同样以 RGB 图像为例,通道数 C=3
。在 NCHW
格式中,所有像素的红色通道数据首先存储,然后是绿色通道数据,最后是蓝色通道数据。
对于同样的 2x2 RGB 图像,数据排列为 NCHW
,则内存中的线性存储顺序为:
R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3
这里 R0, R1, R2, R3
是四个像素的红色通道值,接下来是绿色通道,最后是蓝色通道。
遍历顺序
最内层 :先遍历宽度 W
其次 :然后遍历高度 H
再次 :再遍历通道 C
最外层 :最后遍历批次 N
2. NHWC 格式存储方式
NHWC
格式表示数据存储的顺序是:批次(N),高度(H),宽度(W),通道(C)。以 RGB 图像为例,通道数 C
等于 3,对应 R、G、B 三个通道。假设有一个形状为 [N, H, W, C]
的张量,其中 C=3
,对应 RGB 通道。
例如,假设一个 2x2 的 RGB 图像,数据排列为 NHWC
,则内存中的线性存储顺序为:
R0, G0, B0, R1, G1, B1, R2, G2, B2, R3, G3, B3
这里 R0, G0, B0
是第一个像素的红、绿、蓝通道值,R1, G1, B1
是第二个像素,依此类推。
遍历顺序
最内层 :先遍历通道 C
其次 :然后遍历宽度 W
再次 :再遍历高度 H
最外层 :最后遍历批次 N