题记:在计算机辅助设计领域,经常会用到多线程并行计算技术。用来做这种计算的机器一般是单路多核或多路多核的工作站或服务器,比如四路至强E5平台。在这种机器里,每个计算核心的性能都是一样的。然而,在ARM界,有一种被称为“大小核”的技术,把不同性能的A72和A53集成在一个芯片里。大家一定很好奇,这样的奇葩架构还能不能正常并行呢?今天我们就来试一试吧。
测试背景:目前,多核技术已经成为桌面平台和移动平台芯片的主流技术。英特尔、AMD和联发科等都在“堆核”。
一般来说,X86_64架构的机器会使用多块相同型号处理器组成多路计算平台。平台内每路处理器芯片是一样的,每一个内核当然也都是一样的。这样的机器,多线程调度起来比较简单,给每个线程分配差不多任务量的工作就可以了。
ARM架构处理器就花哨多了,除了“堆核”,近年来还整出了“大小核”。比如RK3399,集成了两个A72核心和四个A53核心。多线程计算时候,有可能A72已经干完了自己的活,但是A53还在吭哧吭哧地墨迹,然后A72像吃瓜群众一样傻等A53。(这个跟联发科那种由于主动大小核切换导致A72不干活的机理有些不太一样)
那么问题来了,那么花哨的架构,多线程计算时候怎么防止“一核有难多核围观”的惨案呢?
我给大家推荐一个能自动均衡各线程负载的并行计算库,名字叫OpenMP。
OpenMP简介:OpenMP的执行模型采用fork-join(分叉-合并)的形式,以线程为基础。其中fork创建线程或者唤醒已有线程;join即多线程的会合。
所有并行线程通过分叉池来分配工作,当一个线程完成自己的队列任务以后,会随机从其他正在工作的线程的队列尾部获取一个任务(工作窃取算法)。
于是,空闲线程能够分担从别的线程分解出来的子任务。这样就不会发生A72干完自己的队列,然后傻等A53的惨案了。
诚然,OpenMP也不是完美的。对于A72+A53这种大小核的独特架构,调度和同步的工作量非常大,会在调度过程中造成大量的消耗。性能上并不能2+1=3。
开发板:友善之臂团队给我们送来了他们新出的板子Nano PCT4。T4的处理器芯片是瑞芯微RK3399,有4个1.4GHz的A53核心和2个1.8GHz的A72核心,属于传说中的“大小核”架构芯片。
为了做对比,我还找来了友善之臂的另一个产品——Nano PCT3 Plus,它是T4的哥哥。T3的处理器是三星的S5P6818,有8个1.4GHz的A53核心。
测试:
下面开始测试吧。首先,我们把测试程序准备好。
为了避免作弊的嫌疑,也为了让测试透明,我们自己来写个OpenMP多线程浮点计算代码吧。
先来个8线程并行代码。(单线程计算要花费的基准时间也在代码里测了)。
上面这是个圆周率推导程序,我们先用T3跑一下。
在上图中,我们可以发现单个A53核心跑这个算法大约需要4.04秒时间。当使用8个A53核心一起跑的时候,时间缩减到约1.63秒。
对于8核A53,8线程并行可以使计算速度提高2.48倍。
我们换T4来跑
在上图中,我们发现单个A72核心跑这个算法大约需要1.08秒时间(比8个A53并行快63%)。可见,A72的单核性能是A53的3.74倍。当使用8线程跑的时候,耗时约1.00秒,与单线程时候相比只提速了8%。这是因为T4的处理器芯片是大小核架构的,多线程对计算速度有一定的加速能力,但是因为调度起来比较费劲,所以速度增幅很小。
不像X86_64那样具有很强的超线程能力,ARM的单核多线程加速能力其实并不好。对于T4的RK3399处理器,总共只有6个核心,分8个线程跑和分6个线程跑其实没太大的速度差别。
我们把第一个代码稍微修改一下,把计算量提高10倍,然后分别测试一下单线程、双线程和六线程。
我们让T4跑一下。
我们可以发现,对于这种大小核架构。单线程耗时约10.114秒,双线并行程耗时约10.040秒,6线程并行耗时约10.039秒;并行有一定的提速效果,但是性能都被多个不同速度线程的调度给浪费了。
小结:今天的测试,我们可以总结以下几点:
1、 A72做浮点计算时候的单核性能大约是A53的3.74倍。
2、 OpenMP可以给大小核的ARM处理器做并行提速
3、 但是提速效果非常的不明显
如果考虑功耗,还不如单核A72,一个就能单挑8个A53了(快63%)。