Toybrick

RKNN 使用 CMA 分配的物理连续内存速度非常慢

seanx

中级会员

积分
349
楼主
发表于 2020-11-28 15:52:51    查看: 12739|回复: 7 | [复制链接]    打印 | 只看该作者
将图像使用 RGA 缩放到 RKNN 模型输入尺寸,为了获得尽可能快的速度,使用 RockchipCmaAlloc 分配了连续的物理内存来使用。
但是测试发现,这样分配的内存送入 RKNN 运算速度要比 malloc 分配的普通内存速度慢了非常多。
经过测试发现,速度差异主要体现在 rknn_inputs_set() 这个接口上,比如说 malloc 的内存这个接口耗时大概 11ms,而 CMA 内存在这个接口上可能需要耗费 60ms 甚至更多。

麻烦大佬们帮帮忙看一下是什么问题,多谢~

回复

使用道具 举报

jefferyzhang

版主

积分
13580
沙发
发表于 2020-11-28 17:20:12 | 只看该作者
1. CMA是物理内存,没有cache,cpu读写肯定慢
2. 异构运算是两个独立系统,就像pc的gpu有自己显存,cpu用内存,这里有一步内存传输动作,NPU也一样。
3. 这个CPU->NPU内存拷贝是用CPU进行的,你CMA内存没有cache读写肯定没有直接malloc的虚拟内存快。
回复

使用道具 举报

seanx

中级会员

积分
349
板凳
 楼主| 发表于 2020-11-29 10:43:31 | 只看该作者
jefferyzhang 发表于 2020-11-28 17:20
1. CMA是物理内存,没有cache,cpu读写肯定慢
2. 异构运算是两个独立系统,就像pc的gpu有自己显存,cpu用内 ...

多谢版主大佬,基本明白了。

想再请问一下,如果我想要尽可能用上 RGA 的硬件加速(连续内存),又需要把这个结果给到 NPU 运算,有没有什么好的解决方案能够兼顾到两者
回复

使用道具 举报

jefferyzhang

版主

积分
13580
地板
发表于 2020-11-29 13:10:50 | 只看该作者
seanx 发表于 2020-11-29 10:43
多谢版主大佬,基本明白了。

想再请问一下,如果我想要尽可能用上 RGA 的硬件加速(连续内存),又需要 ...

提前mmap出虚拟地址后,直接用虚拟地址给rga
回复

使用道具 举报

luxiaofei

高级会员

积分
654
5#
发表于 2020-11-29 17:35:08 | 只看该作者
jefferyzhang 发表于 2020-11-29 13:10
提前mmap出虚拟地址后,直接用虚拟地址给rga

请问RockchipCmaAlloc 分配的cma内存怎么mmap出虚拟地址呢?这一步没有实现,版主能不能指点一下?谢谢啦
回复

使用道具 举报

jefferyzhang

版主

积分
13580
6#
发表于 2020-11-30 08:25:41 | 只看该作者
luxiaofei 发表于 2020-11-29 17:35
请问RockchipCmaAlloc 分配的cma内存怎么mmap出虚拟地址呢?这一步没有实现,版主能不能指点一下?谢谢啦 ...

我没用过这个alloc接口,不知道你说的意思。。
mmap这个c标准函数你难道没用过么?
回复

使用道具 举报

seanx

中级会员

积分
349
7#
 楼主| 发表于 2020-11-30 10:05:17 | 只看该作者
jefferyzhang 发表于 2020-11-30 08:25
我没用过这个alloc接口,不知道你说的意思。。
mmap这个c标准函数你难道没用过么? ...

RockchipCmaAlloc 返回的 buffer 里面有一个 ptr 字段,我理解应该是 mmap 映射出来的地址。把这个 ptr 送到 RGA 里,RGA 的处理速度是要比送 fd 进去慢的,而且这样对后续 RKNN 的速度并没有提升。
自己调用 mmap 把 fd 映射的方式,我这边试了一下,表现跟直接用这个 ptr 是一样的,也并没有达到预期效果。
  1. typedef struct _DrmBuffer {
  2.     int fd;
  3.     unsigned int handle;
  4.     void *ptr;
  5.     size_t size;
  6.     unsigned long phys;
  7. } DrmBuffer, CmaBuffer;
复制代码



回复

使用道具 举报

jefferyzhang

版主

积分
13580
8#
发表于 2020-11-30 10:50:35 | 只看该作者
seanx 发表于 2020-11-30 10:05
RockchipCmaAlloc 返回的 buffer 里面有一个 ptr 字段,我理解应该是 mmap 映射出来的地址。把这个 ptr  ...

那就没有办法了,只能在程序上做一些异步处理。
如果走ptr不可能每次都很慢,后面cache进来就快了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表