本期内容简介
自从把试用申请书里的项目完成以后,本人有些得意忘形,再加上脑洞比较大,于是就妄图做一些更加花里胡哨但是没什么用的评测了,比如GPU测试。服务器的GPU性能一般都不太好,但是不用白不用啊。老师曾经说过,使之来,则使之安。。。。作者话痨症再次发作,此处省略2000字废话。
云芯一号搭载的RK3399处理器芯片集成了Mali-T860GPU,支持OpenGL ES 3.0和OpenCL 1.2。我曾在第一篇试用文章《开箱帖》里,提到过一个CPU和GPU一起“烤机”的代码。因为云芯一号的原厂固件里的GPU驱动不完善,所以当时的测试只跑了删减版的CPU部分,没有把GPU一起“烤”。
今天我们首要任务把Mali-T860 GPU的驱动搞定,让OpenCL和OpenGL都能用起来。
问题解决
驱动不完善,也不能全赖云芯一号的开发小哥。其实这个坑是来自ARM公司。
GPU的驱动,一部分在Linux内核,一部分在userspace。问题在ARM公司只把内核部分的驱动开源了。然而,userspace部分其实也是很重要的,它向下操作内核中的驱动,向上为应用层提供标准的OpenGL与OpenCL的API接口,但是它却没有开源。
云芯一号的开发小哥在linux内核编译时候应该是勾选了GPU驱动的,问题在根文件系统使用ubuntu以后没有把userspace部分的驱动搞定。
ARM没有开源userspace部分的代码,只以库的形式把它提供给授权厂商,比如我们这个RK3399的生产厂家——瑞芯微。所以,可以去瑞芯微下载Mali的驱动。当然,不是源代码,而是已经编译成链接库的驱动。过程步骤如下:
1、下载libmali的链接库
git clone https://gitee.com/rockchip/libmali.git
2、把libmali/lib/aarch64-linux-gnu/libmali-midgard-t86x-r14p0-gbm.so拷贝到/usr/lib/aarch64-linux-gnu/libmali-midgard-t86x-r14p0-gbm.so
3、把libmali/include拷贝到/usr/include
4、把libmali/include/mali.icd放到etc/OpenCL/vendors/mali.icd
5、执行下面命令,为链接库建立软链接
ln -snf /usr/lib/aarch64-linux-gnu/libmali-midgard-t86x-r14p0-gbm.so /usr/lib/aarch64-linux-gnu/libMali.so
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libEGL.so
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libEGL.so.1
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libEGL.so.1.0.0
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libEGL.so.1.4
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libgbm.so
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libgbm.so.1
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libgbm.so.1.0.0
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libGLESv2.so
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libGLESv2.so.2
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libGLESv2.so.2.0
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libGLESv2.so.2.0.0
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libGLESv1_CM.so
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1.1
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libmali.so
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libMaliOpenCL.so
ln -snf /usr/lib/aarch64-linux-gnu/libMali.so /usr/lib/aarch64-linux-gnu/libOpenCL.so
至此,OpenCL和OpenGL就能正常使用了。我有个显示平台信息的OpenCL代码可以给大家测试一下。代码开源在本人的gitee,地址在:
https://gitee.com/xukejing/aijishu/tree/master/ocltest
这次要使用platform.c这个文件,编译执行命令如下:
gcc -o plat platform.c -lOpenCL
./plat
终端上输出了如下图的GPU的信息。
通过以上信息可以看出,平台是ARM,OpenCL版本1.2,GPU型号Mali-T860,最大可申请内存是961MB,最高主频800MHz,计算单元有4个。
热情满满的烤机
下面,我们将要开启3个线程。线程1通过OpenMP的API接口做6线程并行的圆周率计算,把CPU占满;线程2通过OpenCL的API接口做冒泡法数组排列;它们都通过while(1)循环往复地往死算。然后线程3对温度和CPU在线情况作了监控。
这个烤机代码我已经开源了(代码的开源地址https://gitee.com/xukejing/aijishu/tree/master/ocltest)。下面的操作需要用到ickey.c和test.cl两个文件。
编译:
gcc -o hello ickey.c -lpthread -lOpenCL -fopenmp
运行命令):
./hello
这把烤机太给力了,刚开始运行,温度就瞬间爆炸了。于是我赶紧给加了风扇做主动散热,下面的测试截图都是在主动散热情况下做的。下图左侧是运行的终端,输出了处理器温度是40度;并且CPU和GPU都有算法在跑,它们各自计算的每个周期都做了计时。从下图右侧的任务管理器可以看出,CPU占满的时间步长,程序才刚开始跑没过几秒。
然后,过了一段时间,温度依然稳定在40度多点。从下图左侧的终端窗口输出的运行周期可以看出,CPU和GPU的计算速度都没有降低。这表明主动散热的效果是比较显著的,即使在CPU和GPU一起烤机的场合,搭配原厂被动散热片,也能保证长时间稳定工作。
游戏测试
既然GPU驱动已经搞定了,肯定有小伙伴急切地想看看云芯一号能不能打游戏。谁说服务器显卡就只能玩扫雷呢。
我们来DIY一个怀旧游戏机。PSP掌机是二零零几年时候的产品,也快有20年历史了。有个开源的项目,叫PPSSPP,也许有手快的小伙伴已经在安卓,或者x86 windows或x86 linux平台上玩过了。
我找了一下PPSSPP的PPA安装源,发现有ARM64的安装源,但是实际装上后发现运行不了,于是就源代码编译了。
我已经源代码编译把最新版的PPSSPP给装上了。
ARM64版PPSSPP的编译教程我过去给SeeedStudio社区做Jetson Nano评测时候写过一个,当时由芯板坊小月月发在微信公众号了。请看《极客小电脑Jetson Nano评测》 ,那篇文章最后倒数第二章做个游戏机就是。
PPSSPP的编译较复杂,这里直接说编译后的运行结果,抓重点汇报。下面这个图,截取的是在云芯一号上面玩PSP游戏《龙珠Z真武道会2》时候的屏幕,这是个3D游戏,卡通渲染风格。
图像的OpenGL渲染没有问题,但GPU的性能还不够好,导致游戏帧数挺感人的,只有17帧,跑起来有卡顿感。说实话,虽然能玩,只是游戏体验太不好了。所以,还是老老实实把云芯一号当服务器用吧。
展望
今天让OpenCL能用起来了。我们知道,OpenCV 4.2的DNN模块是带有OpenCL接口的。我们可以把上一篇监控服务器的图像识别进程用GPU来跑,解放CPU的算力,然后CPU就可以去做其他更有意义的工作了。