概述 最近工作主要关于自动驾驶工程跨平台迁移,从原来的X86架构工控机形式迁移到英伟达Orin Soc,由于Orin是ARM以及这个嵌入式平台的内核是定制的,所以遇到了很多问题,这里分享出来
在容器里使用CUDA计算在ORIN平台
一开始使用的是ubuntu cuda作为基础镜像,并没有专门使用英伟达Jetson平台的L4T基础镜像,导致在容器里初始化CUDA一直失败,做了一些实验,同样的代码同样的可执行文件在容器外就可以初始化成功,使用L4T作为基础镜像就没有问题,英伟达L4T基础镜像Github上L4T镜像Dockerfile同时启动选项中要加上
docker run --gpus all
或者
docker run --runtime=nvidia
或者使用
nvidia-docker
作为启动项.原因推测的话使用官方的基础镜像CUDA 挂载才是正确的,有知道的大神可以补充。
ARM平台的适配问题
这里主要有两点问题
- 一个是整个工程的依赖库都要切换到Arm平台的
- apollo cyber中关于协程要更新到比较新的commit,支持了Arm相关指令集
cyber/croutine/detail/routine_context.cc
例如在上面这个文件里
#ifdef __aarch64__
char *sp = ctx->stack + STACK_SIZE - sizeof(void *);
#else
char *sp = ctx->stack + STACK_SIZE - 2 * sizeof(void *);
#endif
也可以在整个工程搜索
#ifdef __aarch64__
关键字和百度apollo github代码工程作比较,看哪里需要补充,编译器会自动识别走aarch64分支。
关于arm平台的其他一些问题可以谷歌得到。如果有问题可以提出来进行补充。
一些其他问题
由于整个apollo cyber采取的是分布式节点通讯方式,所以建议一个一个模块的进行编译和适配。整个工程的迁移顺序应如下
- 整个工程Docker image的编译,后续所有编译和运行都在这个镜像里,所以应先把镜像编译出来。遇到问题可以谷歌。这个过程比较耗时,目前是我是在orin上直接进行编译,没有使用交叉编译。
- cyber的编译以及运行
- 各个模块,例如localization,perception等模块的编译运行。
有用的小工具
可视化查看cpu以及gpu使用情况工具jtop
git clone https://github.com/rbonghi/jetson_stats.git
注意在这里进入jtop crtl菜单可以把功耗选到最大,否则CPU和GPU频率会被限制。ORIN CPU最大频率在2.2GHZ,GPU最大频率在1.3GHZ。