痞子衡嵌入式:微控制器CPU性能測試基準(EEMBC-CoreMark)

来源:https://www.cnblogs.com/henjay724/archive/2018/04/06/8729364.html
-Advertisement-
Play Games

在嵌入式系統行業用於評價CPU性能指標的標準主要有三種:Dhrystone、MIPS、CoreMark,其中CoreMark是一種新興流行的嵌入式系統處理器測試基準,被認為是比Dhrystone和MIPS更具有實際價值的測試基準。 ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是微控制器CPU性能測試基準CoreMark

  在嵌入式系統行業用於評價CPU性能指標的標準主要有三種:Dhrystone、MIPS、CoreMark,其中CoreMark是一種新興流行的嵌入式系統處理器測試基準,被認為是比Dhrystone和MIPS更具有實際價值的測試基準。今天痞子衡就和大家詳細聊一聊CoreMark。

一、EEMBC協會

  在講CoreMark之前,必須要先提EEMBC(Embedded Microprocessor Benchmark Consortium)即嵌入式微處理器基準評測協會,它是一個非盈利性組織,該組織目前為止(2018.03)共發佈了46個性能測試基準,有了這些性能基準參考,嵌入式設計人員可以快速有效地選擇處理器。
  EEMBC測試是基於每秒鐘演算法執行的次數和編譯代碼大小的綜合統計結果。眾所周知,編譯器選項會對代碼大小和執行效率會產生巨大的影響,所以每種測試必須包括足夠多的編譯器信息並設置不同的優化項。
  EEMBC發展勢頭很好,其很有可能發展成為嵌入式系統開發人員進行處理器和編譯器性能比較的工業標準。關於EEMBC的更多介紹可移步它的官方網站 http://www.eembc.org/

二、CoreMark標準

  CoreMark是由EEMBC的Shay Gla-On於2009年提出的一項基準測試程式,其主要目標是測試處理器核心性能。
  CoreMark標準的測試方法很簡單,就是在某配置參數組合下單位時間內跑了多少次CoreMark程式,其指標單位為CoreMark/MHz。CoreMark數字越高,意味著性能更高。

2.1 獲取程式

  CoreMark程式的目前(2018.03)最新版本是1.01。

核心程式下載 http://www.eembc.org/coremark/download.php
平臺移植示例 http://www.eembc.org/coremark/ports.php

  核心程式包下載後,在\coremark_v1.0\readme.txt里可見基本介紹,在\coremark_v1.0\docs\Coremark-requirements.doc里可見設計需求。詳細文件目錄如下:

\coremark_v1.0
              \barebones            --移植到裸機下需要修改的文件
                        \core_portme.h    -- 移植平臺工程具體配置信息
                        \core_portme.c    -- 計時以及板級初始化實現  
                        \cvt.c
                        \ee_printf.c      -- 列印函數串口發送實現
              \cygwin               --移植到cygwin下需要修改的文件
              \linux                --移植到linux下需要修改的文件
              \linux64              --移植到linux64下需要修改的文件
              \simple               --基本移植需要修改的文件

              core_main.c           --主程式入口
              core_state.c          --狀態機控制子程式
              core_list_join.c      --列表操作子程式
              core_matrix.c         --矩陣運運算元程式
              core_util.c           --CRC計運算元程式
              coremark.h            --工程配置與數據結構定義

              \docs                 --設計文檔
              coremark.md5
              LICENSE.txt
              Makefile
              readme.txt            --基本介紹
              release_notes.txt     --版本說明

  如果是移植到ARM Cortex-M平臺下裸系統運行,一般只需要修改\barebones目錄下的文件即可(僅需改動三個函數portable_init()、barebones_clock()、uart_send_char()以及core_portme.h中若幹巨集定義),其餘代碼文件不需要修改。關於\barebones下的文件修改,EEMBC上有如下4個示例平臺可參考:

2.2 配置參數

  前面講到做平臺移植時除了必須要改動3個函數外,還需要設置core_portme.h中若幹巨集定義,這些巨集定義即為配置參數,需要根據要移植到的具體平臺的屬性而定。一共如下14個巨集:

巨集 解釋 示例
HAS_FLOAT Define to 1 if the platform supports floating point 1
HAS_TIME_H Define to 1 if platform has the time.h header file and implementation of functions thereof 0
USE_CLOCK Define to 1 if the platform has stdio.h. 0
HAS_STDIO Define to 1 if the platform has stdio.h and implements the printf function. 0
HAS_PRINTF Define to 1 if the platform has stdio.h and implements the printf function. 0
COMPILER_VERSION Please put compiler version here (e.g. gcc 4.1)
COMPILER_FLAGS Please put compiler flags here (e.g. -o3)
MEM_LOCATION Please put the mem location of code execution here (e.g STACK)
CORETIMETYPE Define type of return from the timing functions. ee_u32
SEED_METHOD Defines method to get seed values that cannot be computed at compile time. SEED_VOLATILE
MEM_METHOD Defines method to get a block of memry. MEM_STATIC
MULTITHREAD Define for parallel execution 1
MAIN_HAS_NOARGC Needed if platform does not support getting arguments to main. 1
MAIN_HAS_NORETURN Needed if platform does not support returning a value from main. 0

  細心的朋友應該能註意到core_portme.h文件的最後有如下條件編譯,實際上CoreMark主程式的運行有3種模式可選,即PROFILE_RUN(原型模式)/PERFORMANCE_RUN(性能模式)/VALIDATION_RUN(驗證模式)

#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) && !defined(VALIDATION_RUN)
#if (TOTAL_DATA_SIZE==1200)
#define PROFILE_RUN 1
#elif (TOTAL_DATA_SIZE==2000)
#define PERFORMANCE_RUN 1
#else
#define VALIDATION_RUN 1
#endif
#endif

  而在coremark.h文件的最開始就定義了預設的TOTAL_DATA_SIZE的值為2000,即CoreMark程式預設跑在PERFORMANCE_RUN(性能模式)下。如果你想修改運行模式,需要在編譯器預編譯選項里自定義TOTAL_DATA_SIZE。

/* Configuration: TOTAL_DATA_SIZE
    Define total size for data algorithms will operate on
*/
#ifndef TOTAL_DATA_SIZE 
#define TOTAL_DATA_SIZE 2*1000
#endif

2.3 程式解析

  CoreMark程式使用C語言寫成,包含如下四類運演算法則:數學矩陣操作(普通矩陣運算)、列舉(尋找併排序)、狀態機(用來確定輸入流中是否包含有效數字)、CRC(迴圈冗餘校驗),都是在真實的嵌入式應用中很常見的操作,這也是CoreMark比其他測試標準更有實際價值的原因所在。

a. Matrix multiply (allow for use of MAC operations, common math use)

b. Linked list search/sort/read (common pointer use)

c. State machine (common use of data dependent branches)

d. CRC (common in embedded)

  讓我們嘗試分析CoreMark主函數入口main(以2.2節中配置示例值為例):

/* Function: main
    Main entry routine for the benchmark.
    This function is responsible for the following steps:

    1 - Initialize input seeds from a source that cannot be determined at compile time.
    2 - Initialize memory block for use.
    3 - Run and time the benchmark.
    4 - Report results, testing the validity of the output if the seeds are known.

    Arguments:
    1 - first seed  : Any value
    2 - second seed : Must be identical to first for iterations to be identical
    3 - third seed  : Any value, should be at least an order of magnitude less then the input size, but bigger then 32.
    4 - Iterations  : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs

*/
MAIN_RETURN_TYPE main(void) {
    int argc=0;
    char *argv[1];
    ee_u16 i,j=0,num_algorithms=0;
    ee_s16 known_id=-1,total_errors=0;
    ee_u16 seedcrc=0;
    CORE_TICKS total_time;
    core_results results[MULTITHREAD];

    // 系統板級初始化
    portable_init(&(results[0].port), &argc, argv);

    // ...
    // 設置PERFORMANCE_RUN的初始參數
    results[0].seed1=get_seed(1);  //0x0
    results[0].seed2=get_seed(2);  //0x0
    results[0].seed3=get_seed(3);  //0x66
    results[0].iterations=get_seed_32(4);  //ITERATIONS
    // execs參數為需要跑的演算法使能位
    results[0].execs=get_seed_32(5);       //0x0
    if (results[0].execs==0) { /* if not supplied, execute all algorithms */
        results[0].execs=ALL_ALGORITHMS_MASK;
    }
    // ...

    results[0].memblock[0]=(void *)static_memblk;
    results[0].size=TOTAL_DATA_SIZE;
    results[0].err=0;

    /* Data init */ 
    /* Find out how space much we have based on number of algorithms */
    // ...

    // 各演算法子程式初始化(共LIST, MATRIX, STATE三種)
    for (i=0 ; i<MULTITHREAD; i++) {
        if (results[i].execs & ID_LIST) {
            results[i].list=core_list_init(results[0].size,results[i].memblock[1],results[i].seed1);
        }
        if (results[i].execs & ID_MATRIX) {
            core_init_matrix(results[0].size, results[i].memblock[2], (ee_s32)results[i].seed1 | (((ee_s32)results[i].seed2) << 16), &(results[i].mat) );
        }
        if (results[i].execs & ID_STATE) {
            core_init_state(results[0].size,results[i].seed1,results[i].memblock[3]);
        }
    }

    /* automatically determine number of iterations if not set */
    // ...

    // 開始跑CoreMark程式且記錄累計消耗時間
    start_time();
    iterate(&results[0]);
    stop_time();
    total_time=get_time();

    // ...
    // 最終信息的列印
    // ...
    if (total_errors==0) {
        ee_printf("Correct operation validated. See readme.txt for run and reporting rules.\n");
        if (known_id==3) {
            ee_printf("CoreMark 1.0 : %f / %s %s",default_num_contexts*results[0].iterations/time_in_secs(total_time),COMPILER_VERSION,COMPILER_FLAGS);
            ee_printf("\n");
        }
    }
    // ...

    /* And last call any target specific code for finalizing */
    portable_fini(&(results[0].port));

    return MAIN_RETURN_VAL; 
}

2.4 結果格式

  當移植好CoreMark程式後,便可以開始跑起來了,在跑程式的時候,EEMBC同時制定了必須要遵守規則(不遵守的話,跑分結果不被EEMBC所認可),詳見 https://www.eembc.org/coremark/CoreMarkRunRules.pdf
  當得到跑分結果後可將結果提交到EEMBC網站上,跑分結果需按如下標準格式進行提交:

    CoreMark 1.0 : N / C [/ P] [/ M]

    N - Number of iterations per second with seeds 0,0,0x66,size=2000)
    C - Compiler version and flags
    P - Parameters such as data and code allocation specifics
        - This parameter *may* be omitted if all data was allocated on the heap in RAM.
        - This parameter *may not* be omitted when reporting CoreMark/MHz
    M - Type of parallel execution (if used) and number of contexts
        This parameter may be omitted if parallel execution was not used.

    e.g.
    > CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2
    or
    > CoreMark 1.0 : 1400 / GCC 3.4 -O4

    If reporting scaling results, the results must be reported as follows:

    CoreMark/MHz 1.0 : N / C / P [/ M]

    P - When reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio.
        - If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included.

    e.g.
    > CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache

  如果移植的CoreMark能夠正確運行,你應該可以看到串口會列印出類似如下格式的信息,上述要求的CoreMark標準結果就在列印信息的最後。

2K performance run parameters for coremark. (Run type)
CoreMark Size       : 666                   (Buffer size)
Total ticks         : 25875                 (platform dependent value)
Total time (secs)   : 25.875000             (actual time in seconds)
Iterations/Sec      : 3864.734300           (Performance value to report)
Iterations          : 100000                (number of iterations used)
Compiler version    : GCC3.4.4              (Compiler and version)
Compiler flags      : -O2                   (Compiler and linker flags)
Memory location     : Code in flash, data in on chip RAM
seedcrc             : 0xe9f5                (identifier for the input seeds)
[0]crclist          : 0xe714                (validation for list part)
[0]crcmatrix        : 0x1fd7                (validation for matrix part)
[0]crcstate         : 0x8e3a                (validation for state part)
[0]crcfinal         : 0x33ff                (iteration dependent output)
Correct operation validated. See readme.txt for run and reporting rules.  (*Only when run is successful*)
CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap                          (*Only on a successful performance run*)

2.5 跑分榜

  截止到目前(2018.03),EEMBC網站共記錄535款微控制器的CoreMark跑分結果(註意並不是所有跑分結果都經過EEMBC核實),所有跑分結果可在這裡查詢 http://www.eembc.org/coremark/index.php,下圖是跑分榜部分結果(按提交日期排序)。如果是設計人員根據性能選型的話,可以選按得分高低排序。

2.6 結果示例

  在上節介紹的跑分榜里可點擊微控制器型號查看具體結果,也可選擇多個微控制器進行結果對比。最近兩家ARM Cortex-M微控制器知名廠商恩智浦半導體和意法半導體在高性能微控制器上正一決雌雄,恩智浦推出的i.MX RT1050和意法半導體推出的STM32H743均是基於Cortex-M7內核,且都在2017.10實現初版量產,我們且來比比看這兩款微控制器:

  從對比結果來看,i.MX RT1050在性能上完爆STM32H743,其3036的總得分在Cortex-M微控制器里獨孤求敗,這個跑分結果雖未經過EEMBC認證,但與恩智浦官方給的數據3020基本吻合。
  關於i.MX RT系列微控制器簡介可詳見我的另一篇文章 飛思卡爾i.MX RT系列微控制器介紹篇(1)- 概覽,對於i.MX RT1050跑分結果的驗證與復現可詳見我的文章 飛思卡爾i.MX RT系列微控制器介紹篇(2)- 性能CoreMark

  至此,微控制器CPU性能測試基準CoreMark痞子衡便介紹完畢了,掌聲在哪裡~~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 培訓怎麼說呢,給你鋪墊個底子,前期能避免一些坑,如果是跨專業或者完全0基礎自學的話,在沒有天賦的情況下,的確得踩不少坑,記住前期踩坑可不算成長,有時候各種撞牆,而且撞了屬於白撞。可能你自學的東西與現實工作偏了很遠。其次沒有強烈的興趣愛好在你脫離行業外的時候自學很難堅持下去,可能學著學著就lol一把了 ...
  • 今天發現,火狐瀏覽器從49.0.2升級到50.0.2之後,firebug的js調試被禁用了,果斷去找49.0.2的版本。 鏈接: https://ftp.mozilla.org/pub/firefox/releases/ 想要知道找到這個版本的方法和其他一些問題解決方案的也可以看看下麵的內容。 訪問 ...
  • 今天翻看微信上有關Java技術的公眾號時,看到了一篇關於Java中值傳遞的問題,文章討論了在Java中調用函數進行傳參的時候到底是值傳遞還是引用傳遞這個面試時會問到的問題。之前也接觸過類似的問題,但只是知道是值傳遞,具體到為什麼,一直不是太清楚。今天看了一下,算是明白了,寫個博客記錄一下。 首先先聲 ...
  • 2、求1-100的所有數的和 #除了自定義的列表,我們還能用數字比如for i in range(1,10,3),rang裡面三個數字分別代表開始,結束,步長。 #for中的break,可以在滿足什麼條件的時候退出迴圈: ...
  • 1 導入模塊 1.1 問題 本案例要求先編寫一個star模塊,主要要求如下: 建立工作目錄 ~/bin/ 創建模塊文件 ~/bin/star.py 模塊中創建pstar函數,實現列印50個星號的功能 然後練習導入模塊,調用模塊中的函數: 在交互解釋器中導入模塊 調用模塊的函數 1.2 方案 使用vi ...
  • 在WPF自學入門(十)WPF MVVM簡單介紹中的示例似乎運行起來沒有什麼問題,也可以進行更新。但是這並不是我們使用MVVM的正確方式。正如上一篇文章中在開始說的,MVVM的目的是為了最大限度地降低了Xaml文件和CS文件的耦合度,分離界面和業務邏輯,所以我們要儘可能的在View後臺不寫代碼。但是這 ...
  • 之前寫了一篇C#裝飾模式的文章提到了.NET Core的Stream, 所以這裡儘量把Stream介紹全點. (都是書上的內容) .NET Core/.NET的Streams 首先需要知道, System.IO命名空間是低級I/O功能的大本營. Stream的結構 .NET Core裡面的Strea ...
  • IOC(Inversion of Control):控制反轉 以下以課程與老師的安排來介紹控制反轉。 一個合理的課程編排系統應該圍繞培訓的內容為核心,而不應該以具體的培訓老師為核心,這樣才能在正常授課時可以隨意選取合適的老師來上課,而非綁定到一個老師身上。 一、探索IOC 1、最緊耦合度的編法 老師 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...