012、张量与数据布局:内存模型与对齐策略上周调一个卷积性能问题,在某个边缘设备上跑得比预期慢了三倍。用perf抓热点发现大量时间花在非对齐内存访问上——明明数据尺寸都是4的倍数,为什么还会不对齐?最后定位到问题:张量在内存中的布局和编译器假设的不一致,导致生成的SIMD指令效率暴跌。今天我们就聊聊张量数据布局那些容易踩坑的细节。从一次调试说起当时的情况是这样的:我们有一个[1, 64, 112, 112]的NHWC格式张量,在ARM Cortex-A72上做卷积。理论计算应该能饱和使用NEON单元,实际profiling却发现L1 cache miss率高得异常。查看反汇编发现,编译器生成的vld1.32指令很多都带上了.u32后缀——这是非对齐加载的标志。问题出在张量切片操作上。前序操作产生了一个[1, 64, 112, 111]的中间张量,虽然最后一个维度是111,但分配内存时还是按64字节对齐分配的。然而MLIR的memref在传递步长(stride)信息时,没有把基础对齐信息传递下去,导致后续算子以为整个张量都是111字节对齐,生成的代码自然就保守了。张量在内存中怎么“躺”张量不是简单的一维数组。一个[N, C, H, W]的4D张量,在内存里怎么排列?常见的有两种:NCHW:data[n][c][h][w],相邻的w元素在内存中紧挨着N