VCIP2021:GDR中使用HMVP

本文来自VCIP2021论文《HMVP for GDR of VVC》

为了适应低延迟场景VVC支持GDR图像,GDR图像由clean area和dirty area组成,通过virtual boundary分割。其中clean area中的CU只能使用clean area中的信息来编码。

HMVP是VVC中新增的工具,使得后续MV集更丰富。但是HMVP可能来自dirty area,此时如果clean area中的CU使用这些HMVP则会造成泄露。

HMVP


VVC在帧间预测时支持merge和AMVP,这两种方法对CU都会构建候选MV列表,分别如下:

HMVP列表中包含5个表项,每个表项都来自过去已编码的inter块的MV。每编码完一个inter块就更新一下HMVP表,如果表满了按先进先出顺序移除最早的表项,同时还要去除相同的表项。每个CTU行开始要清空HMVP表。

GDR中的HMVP


如前面所说,GDR图像中使用HMVP可能造成泄露,如Fig.2所示。

由于在每个CTU行HMVP都会重置,使用CTU行中的CTU分为三种:

  • Clean-area CTU:CTU行中的所有CU都在clean area中。

  • Mixed-area CTU:CTU行中的CU一部分在clean area中一部分在dirty area中。

  • Dirty-area CTU:CTU行中的所有CU都在dirty area中。

如Fig.3所示,该CTU行有5个CTU,其中CTU0和CTU1是Clean-area CTU,CTU2是Mixed-area CTU,CTU3和CTU4是Dirty-area CTU。

对于Clean-area CTU(CTU0和CTU1),该CTU行中编码顺序在它前面的inter CU都是在clean area,所以使用HMVP不会造成泄漏。

对于Dirty-area CTU(CTU3和CTU4),编码顺序在它前面的inter CU可能来自clean area也可能来自dirty area,但是dirty area使用clean area的信息不影响编码。

对于Mixed-area CTU(CTU2),编码顺序在它前面的inter CU可能来自clean area也可能来自dirty area,如果clean area中的CU使用了dirty area的信息则会造成错误。

 

Fig.4是一个Mixed-area CTU示例,绿色CU是当前CU,红色虚线是virtual boundary,当前CU在clean area中。假设编码顺序在当前CU之前的5个CU(CU13、CU12、CU11、CU10、CU9)都是inter cu且mv不同,它们的mv将构成HMVP,其中CU9和CU10在dirty area中,如果当前CU使用了它们的mv则会造成错误。

如Fig.5,编码端和解码端都会维护一个HMVP表,MIa是最老的表项,MIe是最新的表项。橙色的表项来自dirty area中的CU,在解码端不能正确解码。在HMVP表中如果一个表项被dirty area影响则比它更早的表项也会受dirty area影响。

Pairwise average MVP也会被merge模式中的HMVP影响,Pairwise average MVP由merge候选列表的前两项平均值生成,如果前两项中有HMVP则Pairwise average MVP也会被影响。HMVP中表项不能正确解码也会影响其他候选项的索引。

综上,Mixed-area CTU中的CU使用HMVP可能会造成错误。而且VVC中merge和AMVP构建候选列表时是无法关闭HMVP的,因此需要编码器自己规避错误。论文提出对于Mixed-area CTU中的CU在使用merge和AMVP模式时强制不选中HMVP及其后的候选项。

实验结果


实验平台选择VTM14.0,使用LDB配置,第一帧设为IDR帧且每2秒插入一个GDR帧。结果如表1所示。

如Fig.9所示,如果解码器从GDR帧开始(非IDR)解码,使用论文方法后则能避免解码错误。

感兴趣的请关注微信公众号Video Coding

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVAPICH2-GDR为GPU RDMA提供了一些接口,可以方便地进行GPU RDMA操作。以下是使用MVAPICH2-GDR进行GPU RDMA操作的基本步骤: 1. 初始化MVAPICH2-GDR库:开发人员需要调用相应的函数来初始化MVAPICH2-GDR库。 2. 创建GPU缓冲区:开发人员需要为GPU分配内存,并创建相应的GPU缓冲区。 3. 注册GPU缓冲区:开发人员需要将GPU缓冲区注册到RDMA适配器的内存区域,以便进行RDMA操作。 ```c void *gpu_addr; cudaMalloc(&gpu_addr, size); register_gpu(gpu_addr, size); ``` 4. 创建RDMA请求:开发人员可以使用MVAPICH2-GDR提供的接口创建RDMA请求。 ```c MPIDI_CH3I_RDMA_put_gpu(void *buf, int len, int dest, uint64_t addr, int rkey, int tag, MPID_Comm *comm, int *req_complete); ``` 5. 执行GPU RDMA操作:开发人员可以使用MVAPICH2-GDR提供的接口进行GPU RDMA操作。 ```c MPIDI_CH3I_RDMA_post_gpu(int type, void *buf, int len, int dest, uint64_t addr, int rkey, int tag, MPID_Comm *comm, int *req_complete); ``` 6. 等待GPU RDMA操作完成:开发人员需要等待GPU RDMA操作完成后,才能继续进行下一步操作。 ```c MPIDI_CH3I_RDMA_wait(void *request); ``` 7. 释放GPU缓冲区:当GPU RDMA操作完成后,开发人员需要释放相应的GPU缓冲区。 ```c unregister_gpu(gpu_addr); cudaFree(gpu_addr); ``` 需要注意的是,MVAPICH2-GDR提供的GPU RDMA接口是比较底层的接口,需要开发人员具备一定的RDMA编程和GPU编程经验。同时,开发人员需要考虑到一些问题,例如数据同步、内存管理等,以实现高效的GPU RDMA操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值