一、CoreMark簡介
什么是CoreMark?
來自CoreMark首頁的解釋是:
CoreMark is a simple, yet sophisticated benchmark that is designed specifically to test the functionality of a processor core. Running CoreMark produces a single-number score allowing users to make quick comparisons between processors.
翻譯一下就是:
CoreMark是一個簡單而又精密的基準測試程序,是專門為測試處理器核功能而設計的。運行CoreMark會產生一個“單個數字”的分數,(從而)允許用戶在(不同)CPU之間進行快速比較。
簡單來說,就是一個測試CPU性能的程序,類似PC上的Cinebench、CPU-Z之類的CPU性能測試工具。
了解了CoreMark是什么之后,接下來我們嘗試在龍芯2K0500先鋒板上跑一下CoreMark,看看分數是多少。
二、在龍芯2K0500上運行CoreMark
2.1 下載CoreMark源碼
在Linux編譯主機上,執行如下命令,將CoreMark源碼下載到本地:
git clone https://github.com/eembc/coremark.git
(左右移動查看全部內容)
下載完成后,可以看到有這些文件和目錄:
2.2 交叉編譯CoreMark
接著編譯CoreMark,這里假設你已經正確設置了龍芯交叉編譯工具鏈,也就是可以直接運行loongarch64-linux-gnu-gcc命令。
在Linux編譯主機上,執行如下命令:
cd coremark
make CC=loongarch64-linux-gnu-gcc link
(左右移動查看全部內容)
其中:
-
CC用于指定編譯器,這里指定的是龍芯GNU交叉編譯器(loongarch64-linux-gnu-gcc);
-
link是make命令的構建目標,具體定義在Makefile文件中,link是只鏈接不運行;
編譯完成后,可以看到生成了coremark.exe:
2.3 運行CoreMark
通過FTP或U盤,將coremark.exe拷貝到龍芯2K0500先鋒板上,使用如下命令運行coremark.exe:
# 添加可執行權限
chmod +x coremark.exe
# 運行
./coremark.exe
運行結束后,輸出如下:
可以看到,龍芯2K0500上CoreMark跑分為2213.205459分。
三、和樹莓派3B+上CoreMark結果對比
我這里測試使用的樹莓派3B+開發板,系統版本信息是:
由于樹莓派3B+上運行的是Debian系統,有完整的編譯工具鏈。因此,在樹莓派3B+上,我們可以直接在開發板上編譯源碼。
在樹莓派3B+上運行CoreMark之前,也需要下載CoreMark源碼,和前面類似:
git clone https://github.com/eembc/coremark.git
(左右移動查看全部內容)
不過這次我們直接將CoreMark源碼下載到了樹莓派上。
3.1 編譯CoreMark
樹莓派上編譯CoreMark之前,需要先安裝編譯構建工具鏈,如果還沒有的話,可以使用如下命令:
sudo apt install build-essential
(左右移動查看全部內容)
PS:如果已經有gcc、make命令,則可以跳過此步驟。
使用如下命令,編譯CoreMark源碼:
cd coremark
make link
3.2 運行CoreMark
使用如下命令運行coremark.exe:
./coremark.exe
(左右移動查看全部內容)
PS:這里由于我們是直接在樹莓派3B+開發板上編譯的CoreMark,所以直接運行即可。
運行結束后,輸出如下:
可以看到,樹莓派3B+上CoreMark跑分為1914.486280。
龍芯2K0500和樹莓派3B+的CoreMark跑分對比:
龍芯2K0500 | 樹莓派3B+ | |
---|---|---|
跑分 | 2213.205459 | 1914.486280 |
可以看到,龍芯2K0500上的CoreMark跑分高于樹莓派3B+。
3.3 其他編譯選項跑分對比
查看CoreMark的Makefile和相關源碼,我們可以知道,通過編譯時添加XCFLAGS參數,可以指定CoreMark的編譯參數。
下面是幾組不同XCFLAGS參數下,龍芯2K0500和樹莓派3B+的CoreMark跑分:
XCFLAGS | 龍芯2K0500 | 樹莓派3B+ |
---|---|---|
2213.205459 | 1914.486280 | |
"-DPERFORMANCE_RUN=1" | 2213.532059 | 1916.198263 |
"-DPERFORMANCE_RUN=1 MEM_METHOD=MEM_STACK" | 2218.278616 | 1915.219612 |
"-DPERFORMANCE_RUN=1 MEM_METHOD=MEM_STATIC" | 2216.475803 | 1916.687963 |
可以看到,幾種不同XCFLAGS參數條件下,龍芯2K0500上的CoreMark跑分都要高于樹莓派3B+。
添加XFLAGS參數后,樹莓派上的編譯命令為(以表格最后一行參數為例):
make XCFLAGS="-DPERFORMANCE_RUN=1 -DMEM_METHOD=MEM_STATIC" link
(左右移動查看全部內容)
響應的,Linux編譯服務器上,交叉編譯命令為:
make CC=loongarch64-linux-gnu-gcc XCFLAGS="-DPERFORMANCE_RUN=1 -DMEM_METHOD=MEM_STATIC" link
(左右移動查看全部內容)
3.4 CoreMark的主要算法
CoreMark項目README的Key Algorithms描述了CoreMark主要用到了那些算法:
-
鏈表(主要是指針操作)
-
矩陣乘法(主要是乘法和加法運算)
-
狀態機(主要是switch-case操作)
說明在這幾種計算場景下,龍芯2K0500的速度都是比樹莓派3B+要快的。
四、額外的CPU測試
接下來我們看看另外一種場景下的測試結果。
我們知道,生成一個較大的大質數,或者判斷一個大整數是否為質數是比較復雜的。
所以,這里我們準備用生成質數在兩個開發板上再次進行測試。
4.1 第n個質數
我們使用如下C程序代碼,計算第n個質數:
// 判斷n是否為質數
bool isprime(uint64_t n)
{
assert(n > 0);
if (n == 2) return true;
if ((n % 2) == 0) return false;
for (uint64_t i = 3, up = n / 2; i < up; i += 2) {
if (n % i == 0) {
return false;
}
}
return true;
}
// 計算第n個質數,例如:1 => 2, 2 => 3, 3 => 5
uint64_t prime(int n)
{
assert(n > 0);
if (n == 1) return 2;
int count = 1;
for (uint64_t i = 3; i < UINT64_MAX; i += 2) {
if (isprime(i)) {
if (++count == n) {
return i;
}
}
}
return 0;
}
int main(int argc, char* argv[])
{
int n = argc > 1 ? atoi(argv[1]) : 10;
clock_t start = clock();
uint64_t prim = prime(n);
clock_t end = clock();
float costs = (end - start) / (float) CLOCKS_PER_SEC;
printf("%10d %.6f %" PRIu64 "
", n, costs, prim);
return 0;
}
(左右移動查看全部內容)
這里為了忽略兩塊開發板內存差異的影響,我們不保存前面得到的質數(雖然保存前面得到的質數,可以加速后續的isprime判斷)。
這里假設保存的文件名為p1.c,樹莓派3B+上使用如下命令編譯:
gcc -O2 -o p1 p1.c
Linux編譯主機上,使用如下命令交叉編譯:
loongarch64-linux-gnu-gcc -O2 -o p1 p1.c
(左右移動查看全部內容)
接下來,分別在龍芯2K0500和樹莓派3B+上運行,得到如下耗時數據(編譯選項:-O2):
n | 龍芯2K0500耗時 | 樹莓派3B+耗時 |
---|---|---|
1000 | 0.018571 | 0.014308 |
2000 | 0.080962 | 0.061902 |
3000 | 0.191983 | 0.146851 |
4000 | 0.353578 | 0.271425 |
5000 | 0.567774 | 0.435833 |
6000 | 0.831575 | 0.640650 |
7000 | 1.153037 | 0.890962 |
8000 | 1.533347 | 1.172405 |
9000 | 1.965950 | 1.517557 |
這里得到的結論是——樹莓派3B+計算質數更快。此前的TFLM測試結果和這里比較類似,同樣顯示,龍芯2K0500成績要稍差一些。
這里龍芯2K500比樹莓派3B+慢的主要原因,很可能是因為求質數算法過程中包含了大量除法運算,而龍芯2K0500的除法運算速度要比樹莓派3B+慢。
4.2 isprime修改
驗證方法也很簡單,我們可以直接修改前面的isprime函數:
// 判斷n是否為質數
bool isprime(uint64_t n)
{
assert(n > 0);
if (n == 2) return true;
if ((n & 1) == 0) return false; // n % 2 => n & 0x1
for (uint64_t i = 3, up = (n >> 1); i < up; i += 2) { // n / 2 => n >> 1
for (uint64_t j = 3; j < up; j += 2) { // 暴力枚舉另外一個因數,不用除法
if (i * j == n) {
return false;
}
}
}
return true;
}
(左右移動查看全部內容)
這里假設保存的文件名為p2.c,樹莓派3B+上使用如下命令編譯:
gcc -O2 -o p2 p2.c
Linux編譯主機上,使用如下命令交叉編譯:
loongarch64-linux-gnu-gcc -O2 -o p1 p1.c
(左右移動查看全部內容)
接下來,分別在龍芯2K0500和樹莓派3B+上運行,得到如下耗時數據(編譯選項:-O2):
n | 龍芯2K0500耗時 | 樹莓派3B+耗時 |
---|---|---|
400 | 0.293424 | 0.302985 |
500 | 0.616077 | 0.634836 |
600 | 1.123482 | 1.162557 |
這里可以看到,龍芯2K500比樹莓派3B+計算要快。
所以,這里驗證了前面的猜想——龍芯2K500比樹莓派3B+的整數除法要慢。
五、參考鏈接
-
CoreMark項目:https://github.com/eembc/coremark
-
龍芯GNU編譯工具鏈下載頁面:http://www.loongnix.cn/zh/toolchain/GNU/
-
加入龍芯小組:https://bbs.elecfans.com/group_1650
本文由電子發燒友社區發布,轉載請注明以上來源。如需社區合作及入群交流,請添加微信EEFans0806,或者發郵箱liuyong@huaqiu.com。
熱門推薦干貨好文
1、社區精選!PCB多層板設計挑戰賽作品集合
2、超強性能AI芯片,OpenHarmony多系統支持,可定制高性能AP(附10+開發Demo)
3、從零入門物聯網OH開源平臺,從簡單到高階項目,創客、電子愛好者都愛用!
4、低成本ESP32方案,支持OpenHarmony系統開發(附10+項目樣例Demo)
5、從0到1玩轉瑞薩RA4系列開發板,教你變著花樣玩板子
6、四核64位,超強CPU ,看RK3568“競”開發板DEMO!
7、人工智能也能這么玩, 簡單快速入手,還能自定義AI運算
8、全部開源 | 基于全志V85X的運動相機,工業網關,可穿戴式攝像頭
9、高性能雙核RISC-V,滿足大多數開發,這款國產MCU工程師都
原文標題:【試用報告】龍芯先鋒板:CPU性能測試—CoreMark和計算質數
文章出處:【微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。
-
電子技術
+關注
關注
18文章
913瀏覽量
56206 -
電子發燒友論壇
+關注
關注
4文章
197瀏覽量
1129
原文標題:【試用報告】龍芯先鋒板:CPU性能測試—CoreMark和計算質數
文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論