2018年末,聯想推出了一種基于TI AM5708芯片的SBC,名字叫栗子板(派)。與樹莓派一樣,栗子板也是只有信用卡一樣大,但是麻雀雖小五臟俱全。最近,機緣巧合下,本人也有幸得到了一塊栗子板。
栗子板的計算處理芯片是TI的AM5708,這是款單核ARM Cortex?A15處理器。大家都知道,雖然A15是款很多年前出的32位的老內核,但是實際上,它的浮點性能要高于近年的64位的A53內核。
當然,對于傳統的A15核心的處理器芯片來說,由于要跑Linux,在一些需要較高時間精度的工控場景中還是有些力不從心的;這時候就需要在應用場景中再增加一片獨立的微控制器(MCU)了。不過,對于AM5708來說,這都不是事兒!
在實時控制的應用場景中,這款AM5708芯片有一個大大的亮點,就是集成了Cortex M4內核,作為Cortex A15的協處理器,彌補了IO輸出的實時性能。這種實時性能,在做小計算量的信號處理時候也能體現,Cortex M4內部也是集成了浮點計算單元的。
另一方面,在需要大計算量的實時信號處理的應用場景中,這款AM5708芯片又有另一個亮點,就是集成了C66DSP核心,其浮點性能要好于Cortex-M4或Cortex-A15內部集成的浮點單元。
嘮了半天的嗑了,相信大家已經迫不及待地想要實機玩玩啦。不管是騾子是馬,趕緊拉出來遛兒?。∥覀冞@就把電源線和網線接上(其中,供電線是USB Type-C接口)。
上電以后,發現聯想的代碼小哥哥貼心地幫我們預裝了Linux操作系統(可以!這很Lenovo);默認已開啟SSH服務,并且root密碼為空,讓我們入手測試更加便利。大家可以通過passwd命令自己設置個喜歡的密碼。
以上這步看似很簡單,但是也充分體現了代碼小哥哥對我們的關懷;因為SSH登錄的前提是網卡開機啟動并開啟DHCP,SSH服務也設置為開機啟動,防火墻關閉或打開22端口。
??
? ? 我們順便看看網卡的MAC和IP吧,命令是ifconfig。這個命令的前提是已經安裝了net-tools,再次感謝一下貼心的代碼小哥!
如果net-tools沒有安裝,要查看網卡信息也是可以的;不過需要通過ip addr命令來實現。
??
? ? 通過hostname命令,我們可以查看電腦名。
Hostname的修改位置在下圖左上角的紅線所示的目錄里,你也可以把圖片靠近中部的紅線標記的字符串改成你喜歡的名字。
查看系統內核信息的方法,本人至少可以想到兩種,如下圖紅線標記處所示。一種是通過uname命令輸出;另一種是用cat命令把內核信息的文件打印到終端上。
查看etc目錄的設置文件時,我偶然地看到了一個有趣的文件夾,從名字意思上判斷,里面放置的是某種可視化腳本。本人比較好奇地把它點開了,但是發現里面的腳本都沒有執行權限;于是我自(no)作(zuo)主(no)張(die)地給添加上了執行權限,編號是755。我好奇地執行了一下其中一個字面意思是輸出溫度的腳本,但是運行結束以后啥也沒有輸出。當然,板子也沒有BOOM。
? ? 于是我更加好奇地把腳本文件打開了。一看,原來是腳本里面漏寫了輸出語句。
? ? 然后,順理成章地,我把這個腳本修改了一下,如下圖所示。其中,圖片左上角紅線標記了腳本文件所在路徑,中下部的各條紅線標記了我添加的那幾個輸出語句。
執行一下這個腳本,成功輸出溫度了。
您也許會發現處理器溫度的數值,看上去略微有些高。畢竟在室溫約25度的情況下,帶著散熱片,都達到了近50度。
? ? 但是大家請不要方。
? ? 畢竟,這是款汽車級處理器啊!
? ? 它具有很廣的許用溫寬(-40~125攝氏度)。值得一提的是,這個125攝氏度并不是存放溫度,而是實實在在的帶電工作的許用溫度,并且已經考慮安全余量了。因此,50度完全在安全裕度內!
??
接下來,想必大家很想看看栗子板在跑實際項目時候的性能,比如您自編的C語言程序。我在測試各種板子時候,寫過不少有趣的代碼;雖然都只是些花拳繡腿,但是用來做評測是夠用了的。這些代碼都被共享在我的開源頁面上了。
??
? ? 栗子板已經安裝了C語言編譯器,可以用gcc -v命令查看編譯器版本。如果你想要編譯CPP代碼,可以用G++,也已經裝上了。
我們的第一個測試代碼是內存寫入速度測試。
? ? 測試前先用free -m命令看一下內存使用情況。別一下子來個1GB的寫入然后就給撐爆了哈!
上圖中,我們發現,可以使用的內存大約是685MB。那就取個整,來個100MB的寫入測試吧。,
? ? 于是,我們寫了個代碼,先測試了單線程的寫入100MB并記錄寫入消耗時間;然后使用OpenMP并行庫做了多線程協同寫入100MB數據的測試。
#include #include #include #include #include "unistd.h"#define MICRO_IN_SEC 1000000.00double microtime();int main(){ int i = 25000000; int ii = 0; int *p1,*p2; double start_time, end_time, dt, dt_err; start_time = microtime(); dt_err = microtime() - start_time; printf("baseline "); start_time = microtime(); p1 = malloc(sizeof(int)*i); for (ii = 0; ii
其中,代碼第11行的i變量定義的是數組長度。接著在第21行里,我們申請了100MB的空間。然后通過一個for循環往里寫入數據。每個32位int的長度是4字節,因此i的值是25000000。
? ? 編譯并執行這個程序,通過打印的結果,我們可以推算出這款板子的內存寫入速度,單線程下是200MB每秒左右;并且單線程下已經達到峰值(當然,還沒有達到內存的理論帶寬)。只是由于處理器核心性能和數量的限制,即使開啟的線程再多也不會有提速了。
作為對比,瑞芯微RK3399芯片(包含2個A72核心+4個A53核心)搭載DDR3內存的工況,我也做了測試,同樣的內存寫入算法,但是修改了寫入量(寫入1GB)。
? ? A53核心的單線程寫入速度也是200MB每秒左右(與AM5708的A15的單線程成績差不多);
? ? A72核心的單線程寫入速度可以超過300MB每秒;
? ? 當6個核心共同并行時,內存寫入速度可以超過1GB每秒。
這里,我劇透一下,聯想即將推出一款搭載RK3399處理芯片的栗子板,規格與友善之臂的RK3399一致!到時候大家都能感受一下那驚人的內存寫入速度。
? ??
? ? 既然已經做了內存測試,CPU浮點計算測試當然也不能少了。
? ? 下面,我將使用本人自創的山寨版SuperPi,它會計算圓周率并記錄計算時間。并行庫依然使用OpenMP。
? ? 程序代碼如下:
#include #include #include #include #include "unistd.h"#include #define MICRO_IN_SEC 1000000.00double microtime();int main(){ double s = 1; double pi = 0; double i = 1.0; double n = 1.0; double dt_err; double dt; double p; double start_time, end_time; long cnt = 0; start_time = microtime(); dt_err = microtime() - start_time; printf("baseline "); start_time = microtime(); for (cnt = 0; cnt<100000000; cnt++) { pi += i; n = n + 2; s = -s; i = s / n; } pi = 4 * pi; dt = microtime() - start_time - dt_err; printf("time = %lf s ", dt); s = 1; pi = 0; i = 1.0; n = 1.0; printf("2threads "); start_time = microtime();#pragma omp parallel for num_threads(2) for (cnt = 0; cnt<100000000; cnt++) { pi += i; n = n + 2; s = -s; i = s / n; } pi = 4 * pi; dt = microtime() - start_time - dt_err; printf("time = %lf s ", dt); s = 1; pi = 0; i = 1.0; n = 1.0; printf("4threads "); start_time = microtime();#pragma omp parallel for num_threads(4) for (cnt = 0; cnt<100000000; cnt++) { pi += i; n = n + 2; s = -s; i = s / n; } pi = 4 * pi; dt = microtime() - start_time - dt_err; printf("time = %lf s ", dt); return 1;}double microtime() { int tv_sec, tv_usec; double time; struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return tv.tv_sec + tv.tv_usec / MICRO_IN_SEC;}
其中,第23行到34行,先做了一個單線程的計算,并計時。
? ? 接著,第36行到53行,是個2線程并行計算測試。
? ? 然后,第55行到72行,是個4線程并行計算測試。
? ? 編譯并運行,截圖如下:
我們可以發現,單線程條件下,大約3秒就可以跑完這個算法。
? ? 然后,因為處理器芯片本身的性能限制(單線程就達到滿載了),多線程工況下并不能獲得更高的速度,而且并行的線程越多,效率越低。4線程并行條件與單線程相比,計算時間從約3秒延長至約4.5秒,甚至達到了50%的“減速比”。
??
? ? 這里,我也可以貼上其他處理器芯片跑相同算法時候的成績。比如三星的S5P6818,這是個8核Cortex A53內核的處理器,測試結果如下圖所示。
我們可以發現一個有趣的現象,64位的A53內核雖然是新內核,但是它的單線程浮點計算能力是要低于老的32位的A15內核低。A15只要約3秒就能算完的算例,放到A53上就需要4秒。也就是說,A15內核與A53相比約有30%的浮點性能提升。誠然,從核心數量和多線程并行角度來看,AM5708與S5P6818相比,總體上還是吃虧的。S5P6818通過8核并行,浮點性能可以達到AM5708的200%(AM5708是約3秒,S5P6818是約1.45秒)
? ? ??
? ? 對了,順便再插一嘴,我們再換個處理器。RK3399的一個A72核心單跑,浮點性能就能超越S5P6818的8個A53一起上。有圖為證。下圖中,baseline的那條1.083秒就是RK3399的A72核心以單線程跑出來的。
所以,想必各位跑分強迫癥已經是迫不及待想玩RK3399了吧。A72核心是2016年出的高性能核心,是要替代A15和A17的。
? ??
評論