Rspress

# #对齐规则

本节内容介绍使用BPU的对齐限制规则。

### #模型输入要求

BPU不限制模型输入大小或者奇偶。既像YOLO这种416x416的输入可以支持，对于像SqueezeNet这种227x227的输入也可以支持。 对于NV12输入比较特别，要求HW都是偶数，是为了满足UV是Y的一半的要求。

### #对齐和有效数据

BPU对数据有对齐限制。有效数据排布和对齐数据排布用 `hbDNNTensorProperties` 中的 `validShape` 和 `stride` 表示。

- `validShape` 是有效数据的shape。
- `stride` 表示 `validShape` 各维度的步长，描述跨越张量各个维度所需要经过的字节数。需要注意，NV12或Y类型输入的模型比较特殊，这些类型的输入只要求W方向满足固定的对齐约束即可，其获取到的 `stride` 均为-1，详细规则可参考 动态输入介绍 章节的描述。

模型输入输出张量可以通过 `validShape` 和 `stride` 获取正确的数据排布， 比如获取到的模型某输入属性 `hbDNNDataType = HB_DNN_TENSOR_TYPE_U16` ， `validShape = [1, 3, 212, 212]` ， `stride = [301056, 100352, 448, 2]` ， 这里表示模型有效输入的大小为 `1x3x212x212` 。

- `stride[3] = 2` ，表示每个元素 `16bit` 大小。
- `stride[2] = 448 = 2 * 224` ，表示 `index=3` 的维度按照 `224` 对齐，因此 `index=3` 的维度步长为 `448` 。
- `stride[1] = 100352 = 448 * 224，` ，表示 `index=2` 的维度也按照 `224` 对齐，因此 `index=2` 的维度步长为 `100352` 。
- `stride[0] = 301056 = 100352 * 3` ，表示 `index=1` 的维度按照 `3` 对齐，和有效尺寸一致，因此 `index=1` 的维度步长为 `301056` 。

在后续场景使用时，考虑到对齐要求，当 `alignedByteSize > 0` 时，建议按照 `alignedByteSize` 大小来申请内存空间。

您可以使用以下方式判断是否需要对模型的输入进行对齐，若公式不成立，您则需要额外对输入数据进行对齐操作。

∏i=1 n−1 v a l i d S h a p e.d i m e n s i o n S i z e[i]==s t r i d e[0]\prod_{i=1}^{n-1}validShape.dimensionSize[i] == stride[0]∏i=1 n−1​v a l i d S ha p e.d im e n s i o n S i ze[i]==s t r i d e[0]，其中 `n=validShape.numDimensions`。

### #模型输入输出内存要求

BPU对模型输入输出内存首地址有对齐限制，要求输入与输出内存的首地址 `32` 或者 `64` 对齐，对应不同的计算平台。

注解

- S600要求 `64`对齐，非S600要求 `32` 对齐。

- 使用 hbUCPMalloc 与 hbUCPMallocCached 接口申请的内存首地址默认 `64` 对齐。

- 当您申请一块内存，并使用偏移地址作为模型的输入或输出时，请检查偏移后的首地址是否满足对齐要求。

页面目录