airockchip / librga

Apache License 2.0
276 stars 52 forks source link

flush RGA cache #58

Closed bluesky2319 closed 9 months ago

bluesky2319 commented 9 months ago

您好,我们的转码应用程序运行 libgstrockchipmpp,它处理 RGA2,但是当任务被终止并重新运行时,我们面临:

rga_mm: the following RGA_MMU unsupported Memory larger than 4G! 同时,通过监控系统使用情况,我看到内存低于2GB。 我很奇怪为什么我会遇到这个问题。 此外,由于我们不直接处理 RGA,调试它给我们带来了一些挑战。 我认为问题与RGA的缓存有关,任务被杀死后没有刷新。 我想知道是否有任何命令可以在终端上运行来清除RGA的缓存。 如果没有,是否有其他方法可以在不处理 RGA 代码的情况下解决此问题? 我将不胜感激你的回答。

blackaddwhite commented 9 months ago

您好,我们的转码应用程序运行 libgstrockchipmpp,它处理 RGA2,但是当任务被终止并重新运行时,我们面临:

rga_mm: the following RGA_MMU unsupported Memory larger than 4G! 同时,通过监控系统使用情况,我看到内存低于2GB。 我很奇怪为什么我会遇到这个问题。 此外,由于我们不直接处理 RGA,调试它给我们带来了一些挑战。 我认为问题与RGA的缓存有关,任务被杀死后没有刷新。 我想知道是否有任何命令可以在终端上运行来清除RGA的缓存。 如果没有,是否有其他方法可以在不处理 RGA 代码的情况下解决此问题? 我将不胜感激你的回答。

可以参考Rockchip_FAQ_RGA_XX中的信息: Q1.8:为什么当搭载8G DDR时,RGA效率较于4G时性能下降严重?

A1.8:由于部分RGA1/RGA2的IOMMU仅支持最大32为的物理地址,而RGA Device Driver、RGA2 Device Driver中对于不满足硬件内存要求的调用申请,默认是通过swiotlb机制进行访问访问受限制的内存(原理上相当于通过CPU将高位内存拷贝至复合硬件要求的低位内存中,再交由硬件进行处理,处理完毕后再通过CPU将低位内存搬运回目标的高位内存上。)因此效率十分低下,通常在正常耗时的3-4倍之间浮动,并且引入受CPU负载影响。

RGA Multicore Device Driver中针对访问受限制的内存会禁用swiotlb机制,直接通过调用失败的方式显示的通知调用者申请合理的内存再调用,来保证RGA的高效。通常伴随着以下日志:

HAL层日志:

RgaBlit(1483) RGA_BLIT fail: Invalid argument Failed to call RockChipRga interface, please use 'dmesg' command to view driver error log. 驱动日志:

rga_policy: invalid function policy //标识存在无效的参数,这里是指没有硬件能够访问当前请求配置的内存。 rga_job: job assign failed //匹配硬件核心失败 rga_job: failed to get scheduler, rga_job_commit(403) rga_job: (pid:3524) job clean use time = 19 rga_job: request[282567] task[0] job_commit failed. rga_job: rga request commit failed! rga: request[282567] submit failed! 驱动运行日志:

rga_policy: start policy on core = 4 [82116.782252] rga_policy: RGA2 only support under 4G memory! //标识当前搭载的RGA2核心仅支持4G以内的内存。 [82116.782256] rga_policy: optional_cores = 0 [82116.782258] rga_policy: invalid function policy [82116.782260] rga_policy: assign core: -1 [82116.782262] rga_job: job assign failed 因此,针对这种场景建议申请4G以内的内存调用librga,常见的分配4G内存方式可以查看以下示例代码:

/samples/allocator_demo/src/rga_allocator_dma32_demo.cpp /samples/allocator_demo/src/rga_allocator_graphicbuffer_demo.cpp 综合以上信息,我推测你使用的设备搭载了4G以上的DDR内存,如果你使用4GB的DDR内存这个问题就会自动消失。但如果鉴于某些客观因素你无法更换成4GB的DDR内存,那么就要从程序源码中rga内存的申请和释放等相关部分入手,也许上一次运行结束时,程序没有正常的释放已申请的内存。如果有类似情况的话,你只要修复它,就不需要在命令行中清除rga cache了。就我已知的信息而言,没有清除rga缓存的终端命令。在我的工作中rga内存都是在程序源码中手动申请和释放的。如果你想在终端中实现清除rga缓存的话我可以提供一个思路,但是否可用需要你自行实现并测试。 1.获知申请了rga cache的进程的pid 2.申请rga cache后通常都会生成一个文件描述符,所以可以根据进程pid查看此进程下的文件描述符,找到rga内存对应的文件描述符。 3.通过rga内存对应的文件描述符,关闭(或着说释放?)rga申请到的内存 4.将上述步骤继承到一个脚本中,在终端中运行这个脚本 至此就达成了你的目的。祝你好运
bluesky2319 commented 9 months ago

@blackaddwhite 感谢您与我分享的信息。 我在 RK3588 的 4GB/8GB/16GB RAM 和内核版本 5.10 中看到了这个问题。 我在FriendlyARM 的内核版本6.1 中没有看到这个问题。 FriendlyARM使用RGA驱动版本1.2.27和RGA_api 1.9.3,不知道是什么原因。 是否与内核版本、驱动版本或您提到的其他内容有关? 新内核版本 (6.1) 的问题是 CPU 使用率比 5.10 更高。

另外,当我们看到这个错误时,我们是否需要考虑并修复它,或者我们可以忽略这个问题吗? 我问这个问题是因为我在结果中没有看到任何不利影响(视觉上)。

blackaddwhite commented 9 months ago

@blackaddwhite 感谢您与我分享的信息。 我在 RK3588 的 4GB/8GB/16GB RAM 和内核版本 5.10 中看到了这个问题。 我在FriendlyARM 的内核版本6.1 中没有看到这个问题。 FriendlyARM使用RGA驱动版本1.2.27和RGA_api 1.9.3,不知道是什么原因。 是否与内核版本、驱动版本或您提到的其他内容有关? 新内核版本 (6.1) 的问题是 CPU 使用率比 5.10 更高。

另外,当我们看到这个错误时,我们是否需要考虑并修复它,或者我们可以忽略这个问题吗? 我问这个问题是因为我在结果中没有看到任何不利影响(视觉上)。

如果在使用了4GB ddr内存的设备上也出现了此类报错,且在其他内核版本时此类报错消失,那么我猜测大概率是内核版本和驱动版本的问题,而与我上次回复中提到的“rga申请的内存没有正确释放”无关。我也遇到过rga的报错,并且更新内核版本后消失了。如果后续开发中没有使用到rga或mpp等硬件加速器,我想是可以忽略这个问题的,但如果条件允许,还是建议更新,就我自身在这款cpu上的视频应用开发经历而言,老的内核还存在一些其他问题会影响应用正常运行,但通过更新内核后都得到了很好的解决。

bluesky2319 commented 9 months ago

@blackaddwhite 再次感谢你。 我差不多明白了。 然后,我们将尝试使用不同的驱动程序版本和新的内核版本。