Closed bluesky2319 closed 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内存方式可以查看以下示例代码:
@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 感谢您与我分享的信息。 我在 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上的视频应用开发经历而言,老的内核还存在一些其他问题会影响应用正常运行,但通过更新内核后都得到了很好的解决。
@blackaddwhite 再次感谢你。 我差不多明白了。 然后,我们将尝试使用不同的驱动程序版本和新的内核版本。
您好,我们的转码应用程序运行 libgstrockchipmpp,它处理 RGA2,但是当任务被终止并重新运行时,我们面临:
rga_mm: the following RGA_MMU unsupported Memory larger than 4G!
同时,通过监控系统使用情况,我看到内存低于2GB。 我很奇怪为什么我会遇到这个问题。 此外,由于我们不直接处理 RGA,调试它给我们带来了一些挑战。 我认为问题与RGA的缓存有关,任务被杀死后没有刷新。 我想知道是否有任何命令可以在终端上运行来清除RGA的缓存。 如果没有,是否有其他方法可以在不处理 RGA 代码的情况下解决此问题? 我将不胜感激你的回答。