CANN数据预处理中的对齐,是个比较琐碎的事情,但是在预处理中,又不得不关注,因为对齐是个有约束性的要求,也直接影响到数据存储的内存分配,还是从头说起。
CANN数据预处理,实际上就是 图像/视频数据处理 ,具体内容如下:
这个列表里的功能可以分为2类:
- VPC(缩放/色域转换、抠图等)
- 图片编解码(JPEGD/E PNGD) 以及衍生的视频编解码(VDEC/ENC)
而这些功能的使用,以 缩放 为例,流程和主干代码(关键步骤的代码示例) 在文档里都描述的非常清楚。
至于对齐之类的细节,则是在 API参考文档 里有说明。
比如 VPC 功能,输入输出、对齐以及内存大小,这些约束如下:
可以看到,对于同样的图片格式,输入和输出的约束是一样的。
并且通过对比可以发现,昇腾310P(2022年将全面推广,最终名称到时见分晓)和之前的昇腾310和910,约束的要求是一样的。
但是,
看 JPEGD 功能的API参考的话,就会发现有区别了,原来要求是宽stride为128对齐,现在是缩小了颗粒度,要求是64对齐。其他一样。这样对于内存的占用在某些情况下就减少了。
最后看一下CANN里的对齐代码,就是通过一个简单的宏定义来实现,这里将代码拿出来方便的看一下某个尺寸是否要对齐:
#include <stdio.h>
#define ALIGN_UP(x, a) ( (((x) + ((a) - 1U)) / (a)) * (a) )
int main(){
int len,align;
printf("input an integer to be aligned:");
scanf("%d",&len);
printf("input align with:");
scanf("%d",&align);
printf("after ALIGN:%d\n", ALIGN_UP(len,align));
}
可以看到高是1080时,按16对齐,是对不齐的,差8。所以对齐操作后是1088
[root@ecs-d589 ~]# ./a.out
input an integer to be aligned:1080
input align with:16
after ALIGN:1088