CANN数据预处理中的尺寸对齐

举报
黄生 发表于 2022/06/13 18:34:21 2022/06/13
【摘要】 CANN数据预处理中的对齐,是个比较琐碎的事情,但是在预处理中,又不得不关注,因为对齐是个有约束性的要求,也直接影响到数据存储的内存分配,还是从头说起。CANN数据预处理,实际上就是 图像/视频数据处理 ,具体内容如下:这个列表里的功能可以分为2类:VPC(缩放/色域转换、抠图等)图片编解码(JPEGD/E PNGD) 以及衍生的视频编解码(VDEC/ENC)而这些功能的使用,以 缩放 为例...

CANN数据预处理中的对齐,是个比较琐碎的事情,但是在预处理中,又不得不关注,因为对齐是个有约束性的要求,也直接影响到数据存储的内存分配,还是从头说起。
CANN数据预处理,实际上就是 图像/视频数据处理 ,具体内容如下:

image.png

这个列表里的功能可以分为2类:

  1. VPC(缩放/色域转换、抠图等)
  2. 图片编解码(JPEGD/E PNGD) 以及衍生的视频编解码(VDEC/ENC)

而这些功能的使用,以 缩放 为例,流程和主干代码(关键步骤的代码示例) 在文档里都描述的非常清楚。

至于对齐之类的细节,则是在 API参考文档 里有说明。
比如 VPC 功能,输入输出、对齐以及内存大小,这些约束如下:
image.png

image.png

可以看到,对于同样的图片格式,输入和输出的约束是一样的。

但是,

JPEGD 功能的API参考的话,就会发现有区别了,原来要求是宽stride为128对齐,现在是缩小了颗粒度,要求是64对齐。其他一样。这样对于内存的占用在某些情况下就减少了。

image.png

image.png

最后看一下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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。