Toybrick

标题: RKNN 使用 CMA 分配的物理连续内存速度非常慢 [打印本页]

作者: seanx    时间: 2020-11-28 15:52
标题: RKNN 使用 CMA 分配的物理连续内存速度非常慢
将图像使用 RGA 缩放到 RKNN 模型输入尺寸,为了获得尽可能快的速度,使用 RockchipCmaAlloc 分配了连续的物理内存来使用。
但是测试发现,这样分配的内存送入 RKNN 运算速度要比 malloc 分配的普通内存速度慢了非常多。
经过测试发现,速度差异主要体现在 rknn_inputs_set() 这个接口上,比如说 malloc 的内存这个接口耗时大概 11ms,而 CMA 内存在这个接口上可能需要耗费 60ms 甚至更多。

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


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

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

想再请问一下,如果我想要尽可能用上 RGA 的硬件加速(连续内存),又需要把这个结果给到 NPU 运算,有没有什么好的解决方案能够兼顾到两者
作者: jefferyzhang    时间: 2020-11-29 13:10
seanx 发表于 2020-11-29 10:43
多谢版主大佬,基本明白了。

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

提前mmap出虚拟地址后,直接用虚拟地址给rga
作者: luxiaofei    时间: 2020-11-29 17:35
jefferyzhang 发表于 2020-11-29 13:10
提前mmap出虚拟地址后,直接用虚拟地址给rga

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

我没用过这个alloc接口,不知道你说的意思。。
mmap这个c标准函数你难道没用过么?
作者: seanx    时间: 2020-11-30 10:05
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    时间: 2020-11-30 10:50
seanx 发表于 2020-11-30 10:05
RockchipCmaAlloc 返回的 buffer 里面有一个 ptr 字段,我理解应该是 mmap 映射出来的地址。把这个 ptr  ...

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




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3