TB-RX65N/TB-RX231/TB-RX130+CC-RX/GNURXでCoreMark®ベンチマークを動かせるようにしてみようと思います

こんにちは。NoMaYです。#2連投の1つ目です。

ルネサスさんのアプリケーションノートに以下の『RX100シリーズ RX100上でCoreMarkを実行する方法』というRSK-RX111+IAR EW統合開発環境でEEMBCのCoreMarkベンチマークを実行するものがあったのですが、これをRX-TB 3種類+CC-RX/GNURXへ移植してみようと思います。まず、手始めにTB-RX130+CC-RX+CS+で試してみました。(後日、他のTBボードやGNURXでも動かしてみようと思います。さらに、e2 studioでも動かせるようにしてみようと思います。なお、その時は、GitHub上でEEMBCが公開しているCoreMarkベンチマークの以下のリポジトリのソースに差し替え、かつ、RXスマートコンフィグレータが生成したソースを出来るだけ使うような作りに変更しよう、と思っています。)

プロジェクトのファイル一式
tb_rx130_coremark_ccrx_c_csplus_20191026.zip    384KB

アプリケーションノート: RX100シリーズ RX100上でCoreMarkを実行する方法
www.renesas.com/jp/ja/search?keywords=CoreMark&f[0]=content_type:document

ドキュメント
www.renesas.com/jp/ja/document/apn/rx100-series-running-coremark-rx100

サンプルプログラム
www.renesas.com/jp/ja/document/scd/rx100-series-running-coremark-rx100

GitHub上でEEMBCが公開しているCoreMarkベンチマークのソース
github.com/eembc/coremark


TB-RX130+CC-RX V2.03で試した結果と試した時のCC-RXの最適化オプションは、以下の画面コピーの通りです。得られたCoreMark値が91.5、動作周波数が32MHz、よって、CoreMark/MHzは2.86、となりました。(ちなみに、CoreMark値やCoreMark/MHzは、そもそもそういうものなのですが、最適化オプションによりかなり値が変わります。) なお、以下の画面コピーの通り、RSK-RX111+EWRX V2.41.1でのCoreMark/MHzは3.073のようでした。また、ルネサスさんの製品ページでのRX130(やRX111)のCoreMark/MHzは3.08です。




  • こんにちは。NoMaYです。#2連投の2つ目です。

    今回、ルネサスさんのアプリケーションノートのソースから変更したファイルと変更した箇所は、以下の画面コピーの通りです。仕様面の変更として、RxD1/TxD1をP15端子(J1-30)/P16端子(J1-31)からP30端子(J1-20)/P26端子(J1-22)へ変更しています。(RxD1/TxD1が両方とも基板外側のスルーホールになるので、両方とも楽にクリップで引っ掛けられるようになるので。)

    アプリケーションノートのもともとのソース一覧(bspフォルダとCoreMarkフォルダ)



    今回のプロジェクトのソース一覧(bspフォルダのソースのみ変更してCoreMarkフォルダのソースは変更せず)



    変更したソースと変更箇所






  • こんにちは。NoMaYです。#3連投の1つ目です。

    GitHub上でEEMBCが公開しているCoreMarkベンチマークのソースを使用して、RX-TB 3種類+CC-RX/GNURXでCoreMark値とCoreMark/MHz値を計測してみました。ボード依存部にはRXスマートコンフィグレータV2.3.0(2019/11リリース)が生成したソースを使用して、CS+ V8.02/e2 studio V7.6.0でビルドしました。結果は以下の通りでした。(小数点以下3桁目以降は切り捨てです。)

      CC-RX V2.03 GNURX 2019q2(4.8.4.201902) 公称値
    コンパイル最適化オプション -optimize=max -speed -goptimize -O3 -flto
    リンク最適化オプション -optimize=speed
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX130 (RX130 32MHz) 91.32 2.85 61.38 1.91 3.08
    TB-RX231 (RX231 54MHz) 197.65 3.66 137.11 2.53 4.16
    TB-RX65N (RX65N 120MHz) 472.27 3.93 326.61 2.72 4.34

    プロジェクトのファイル一式 (CC-RX V2.03/GNURX 2019q2(4.8.4.201902)でビルド、zipファイルをe2 studioに直接インポート可)
    japan.renesasrulz.com/cafe_rene/m/sample_program/437
    tb_rx65n_rx231_rx130_coremark_20191110.zip    2.45MB

    含まれるプロジェクト (*1,*2,*3)
    tb_rx130_scfg_ccrx_c/{tb_rx130_ccrx_c.mtpj, .project}
    tb_rx231_scfg_ccrx_c/{tb_rx231_ccrx_c.mtpj, .project}
    tb_rx65n_scfg_ccrx_c/{tb_rx65n_ccrx_c.mtpj, .project}
    tb_rx130_scfg_gnurx_c/.project
    tb_rx231_scfg_gnurx_c/.project
    tb_rx65n_scfg_gnurx_c/.project

    *1:以前に別スレッド『RenesasさんからRXマイコンの低価格Target Boardが出たのでサンプルプログラムをCSplus projectへ変換してみようと思います』に投稿したプロジェクトと同じIDコードを設定しています。

    *2:実機用のデバッガプロパティ設定(CS+)や.launchファイル設定(e2 studio)は当方特有の事情でオンボードエミュレータが使えない為に未確認です。(ひと通りは設定してあります。)

    *3:BSPモジュールのPDFドキュメントは除外してあります。(zipファイルのサイズを小さく抑える為です。)

    ちなみに、CoreMark値やCoreMark/MHz値は、そもそもそういうものなのですが、最適化オプションにより値が変化します。一例として、かふぇルネへ投稿する時に今まで私が使用していた最適化オプションでは、以下の通りとなりました。(なお、以下の値ですが、CC-RXではサイズ優先最適化となっているのに対し、GNURXでは(最適化オプションの考え方が異なるので1対1に対比させることは出来ないが近い感覚として)スピード優先最適化となっている、という点に留意しておいて下さい。後日、サイズも比較してみようと思っています。)

      CC-RX V2.03 GNURX 2019q2(4.8.4.201902) 公称値
    コンパイル最適化オプション -optimize=2 -size (共にデフォルト) -O2
    リンク最適化オプション
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX130 (RX130 32MHz) 51.56 1.61 59.54 1.86 3.08
    TB-RX231 (RX231 54MHz) 113.36  2.09 131.51 2.43 4.16
    TB-RX65N (RX65N 120MHz) 274.45  2.28 324.12 2.70 4.34

    この後、2投目、3投目は以下の通りです。

    2投目

    ・プロジェクト構造とCC-RX/GNURXの最適化オプション設定
    ・GitHub上でEEMBCが公開しているCoreMarkベンチマークのソースからの変更箇所
    ・RXスマートコンフィグレータが生成したソースのStart user code~End user code内に追加したコード

    3投目

    ・実行結果を、SCI1経由でTeraTermへ表示させるのでは無く、デバッグコンソールへ表示させる設定(ただし未確認ですが)
    ・RXスマートコンフィグレータでGNURX向けコードを再生成する場合のリンカスクリプトの注意点

    以下、画面コピーと写真です。

    CC-RXでビルドした場合の実行結果


    GNURXでビルドした場合の実行結果


    実行結果はSCI1経由で出力


    EEMBCのウェブサイトに掲載されているCoreMark値とCoreMark/MHz値
    www.eembc.org/coremark/scores.php

     

  • こんにちは。NoMaYです。#3連投の2つ目です。

    プロジェクト構造とCC-RX/GNURXの最適化オプション設定は以下の画面コピーの通りです。

    CC-RX+CS+の場合



    CC-RX+e2 studioの場合



    GNURX+e2 studioの場合



    GitHub上でEEMBCが公開しているCoreMarkベンチマークのソースからの変更箇所は以下の画面コピーの通りです。なお、リポジトリと今回使用したソースのURLは以下の通りです。

    リポジトリ
    github.com/eembc/coremark

    今回使用したソース
    github.com/eembc/coremark/tree/21d473aae1

    変更したソースと変更箇所






    RXスマートコンフィグレータが生成したソースのStart user code~End user code内に追加したコードは以下の通りです。また、これらの中で、CoreMarkベンチマークのソースのportmeソースとインターフェイスする為の関数はtimer_gettick()とserial_charput()の2つ(赤文字箇所)です。

    src/smc_gen/Config_MTU2/Config_MTU2.h

    /* Start user code for function. Do not edit comment generated here */
    unsigned long timer_gettick(void);
    /* End user code. Do not edit comment generated here */

    src/smc_gen/Config_MTU2/Config_MTU2.c

    /* Start user code for adding. Do not edit comment generated here */

    unsigned long timer_gettick(void)
    {
        unsigned long cycles;

        /* Stop the lower 16-bit counter (it makes also the upper 16-bit counter stop) */
        R_Config_MTU2_Stop();

        /* Combine two 16-bit counters to form 32-bit counter value */
        cycles =  ((unsigned long)(MTU2.TCNT) &  0xffff);
        cycles |= ((unsigned long)(MTU1.TCNT) << 16);

        /* Resume the lower 16-bit counter (it makes also the upper 16-bit counter resume) */
        R_Config_MTU2_Start();

        return cycles;
    }

    /* End user code. Do not edit comment generated here */   

    src/smc_gen/Config_SCI1/Config_SCI1.h

    /* Start user code for function. Do not edit comment generated here */
    void serial_charput(char output_char);
    /* End user code. Do not edit comment generated here */

    src/smc_gen/Config_SCI1/Config_SCI1.c

    /* Start user code for global. Do not edit comment generated here */
    volatile bool g_SCI1_tx_ready_flag = false;           /* SCI1 transmit end flag */
    /* End user code. Do not edit comment generated here */
    /* Start user code for adding. Do not edit comment generated here */

    void serial_charput(char output_char)
    {
        R_Config_SCI1_Serial_Send((uint8_t *)&output_char, 1);
        do {} while (false == g_SCI1_tx_ready_flag);
        g_SCI1_tx_ready_flag = false;
    }

    /* End user code. Do not edit comment generated here */   

    src/smc_gen/Config_SCI1/Config_SCI1_user.c

    /* Start user code for global. Do not edit comment generated here */
    extern volatile bool g_SCI1_tx_ready_flag;                   /* SCI1 transmit end flag */
    /* End user code. Do not edit comment generated here */
    static void r_Config_SCI1_callback_transmitend(void)
    {
        /* Start user code for r_Config_SCI1_callback_transmitend. Do not edit comment generated here */
        g_SCI1_tx_ready_flag = true;
        /* End user code. Do not edit comment generated here */
    }

    src/smc_gen/general/r_cg_hardware_setup.c

    /* Start user code for global. Do not edit comment generated here */

    /* Workaround to execute additional initialization */
    void R_Systeminit1(void);
    void R_Systeminit2(void);
    void R_Systeminit(void)
    {
        R_Systeminit1();
        R_Systeminit2();
    }
    #define R_Systeminit R_Systeminit1

    /* End user code. Do not edit comment generated here */
    /* Start user code for adding. Do not edit comment generated here */

    void R_Systeminit2(void)
    {
        /* Do not call any functions which enables generating any interrupt requests. */
        R_Config_SCI1_Start();
        R_Config_MTU1_Start();
        R_Config_MTU2_Start();
    }

    /* End user code. Do not edit comment generated here */   

     

  • こんにちは。NoMaYです。#3連投の3つ目です。

    現状、実行結果をSCI1経由でTeraTermへ表示させるようにしていますが、一応、プログラムの作りとして、RXスマートコンフィグレータでBSPモジュールの設定を以下の画面コピーの通りに変更して、コードを再生成してビルドすることで、実行結果をデバッグコンソールへ表示させることも出来るようにしたつもりです。(ただし、当方特有の事情でオンボードエミュレータが使えない為、未確認ですが。) なお、GNURX向けコードを再生成した時、別スレッド『RX SmartConfiguratorのGNURX向け生成コードのBugではないかと思われる動作について』に書いたリンカスクリプトの修正や、(今回は必ずしも必要だった訳ではないのですが)別スレッド『e2 studio+GNURXでFreeRTOSプロジェクトもどきSample Programを作ってRenesas RX Simulator/TB-RX65Nで試せるようにしてみた』に書いたリンカスクリプトの変更が、上書きされて元に戻って(消えて)しまいますので、以下の画面コピーのlinker_script_backup.ldをlinker_script.ldへコピーしてからビルドして下さい。(ちなみに、今回気付いたのですが、残念ながら、リンカスクリプトはtrashフォルダへバックアップされていませんでした。)

    現状: 実行結果をSCI1経由でTeraTermへ表示する場合


    変更: 実行結果をデバッグコンソールへ表示する場合


    GNURX向けコードを再生成した時はinker_script_backup.ldをlinker_script.ldへコピーしてからビルドして下さい

     

  • こんにちは。NoMaYです。

    ソースレベルデバッグを快適に行うには最適化レベルを下げる必要がありますが(CC-RXでは-optimize=0/GNURXでは-Og)、CoreMark値(とCoreMark/MHz値)がどれほど低下するのか計測してみました。結果は以下の通りでした。(小数点以下3桁目以降は切り捨てです。) CC-RXでは公称値の20%ほどにまで低下してしまいました、、、

      CC-RX V2.03 GNURX 2019q2(4.8.4.201902) 公称値
    コンパイル最適化オプション -optimize=0 -Og
    リンク最適化オプション
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX130 (RX130 32MHz) 21.12 0.66 41.17 1.28 3.08
    TB-RX231 (RX231 54MHz) 39.36 0.72 92.91 1.72 4.16
    TB-RX65N (RX65N 120MHz) 90.48 0.75 222.36 1.85 4.34

    以下、画面コピーです。

    CC-RXでビルドした場合の実行結果 (最適化オプションはソースレベルデバッグに適しているとされる設定)


    GNURXでビルドした場合の実行結果 (最適化オプションはソースレベルデバッグに適しているとされる設定)

     

  • こんにちは。NoMaYです。

    試しにFreeRTOS環境下でCoreMarkベンチマークを実行してみました。(FreeRTOS環境下で、というのは、FreeRTOSのTick割り込み(1ms毎)が発生している状況であり、他にも実行すべきタスクがあればそれらも実行されている状況である、ということです。) 結果としては、以下の通り、他に同一優先度タスク(や高優先度タスク)が無ければ少々低下した程度であり、もちろん、当然ながら、他に同一優先度タスクが1つあれば半分に低下しただけ、でした。なお、GNURXで-fltoを指定していると動作しなくなってしまいましたので、-fltoは外しました。(FreeRTOSのReadmeにGNUARMですが-fltoに関連した記述があったので、FreeRTOSでは何かがあるのかも知れません。詳細は調べていません。)

    結果その1 : 他に同一優先度タスク(や高優先度タスク)が無ければ少々低下

      CC-RX V2.03 ← 同左 公称値
    コンパイル最適化オプション -optimize=max -speed -goptimize ← 同左
    リンク最適化オプション -optimize=speed ← 同左
      FreeRTOS無し FreeRTOS環境下
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX65N (RX65N 120MHz) 472.27 3.93 464.81 3.87 4.34

     

      GNURX 2019q2(4.8.4.201902) ← 同左 公称値
    コンパイル最適化オプション -O3 ← 同左
    リンク最適化オプション ← 同左
      FreeRTOS無し FreeRTOS環境下
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX65N (RX65N 120MHz) 326.24 2.71 325.87 2.71 4.34


    結果その2: 他に同一優先度タスクが1つあれば半分に低下(当然ながら)

      CC-RX V2.03 ← 同左 公称値
    コンパイル最適化オプション -optimize=max -speed -goptimize ← 同左
    リンク最適化オプション -optimize=speed ← 同左
      FreeRTOS環境下
    CoreMarkタスクのみ

    FreeRTOS環境下
    CoreMarkタスク
    同一優先度タスク1つ
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX65N (RX65N 120MHz) 464.81 3.87 237.02 1.97 4.34

     

      GNURX 2019q2(4.8.4.201902) ← 同左 公称値
    コンパイル最適化オプション -O3 ← 同左
    リンク最適化オプション ← 同左
      FreeRTOS環境下
    CoreMarkタスクのみ

    FreeRTOS環境下
    CoreMarkタスク
    同一優先度タスク1つ
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX65N (RX65N 120MHz) 325.87 2.71 162.87 1.35 4.34

     

    プロジェクトのファイル一式 (CC-RX V2.03/GNURX 2019q2(4.8.4.201902)でビルド、zipファイルをe2 studioに直接インポート可)
    tb_rx65n_scfg_freertos_coremark_ccrx_c_csplus_20191121.zip    734KB
    tb_rx65n_scfg_freertos_coremark_gnurx_c_e2v760_20191121.zip    708KB

    含まれるプロジェクト (*1,*2,*3, *4, *5)
    tb_rx65n_scfg_freertos_ccrx_c/{tb_rx65n_ccrx_c.mtpj, .project}
    tb_rx65n_scfg_freertos_gnurx_c/.project

    *1,*2,*3:前回投稿した時と同じです。

    *4:RXスマートコンフィグレータV2.3.0(2019/11リリース)が生成したソースを使用しています。

    *5:e2 studioネイティブのFreeRTOSプロジェクトでは無く、通常の(非FreeRTOS)プロジェクトにFreeRTOSのソースを追加したものです。その為、RXスマートコンフィグレータ上で、FreeRTOS KernelコンポーネントもFreeRTOS Objectコンポーネントも扱うことは出来ません。(e2 studioネイティブのFreeRTOSプロジェクトは、GNURXで使えなかったり、CS+で使えなかったり、CGコンポーネントが使えなかったり、と私には、FreeRTOS KernelコンポーネントやFreeRTOS Objectコンポーネントが扱えないこと以上に不便なもの、でしたので。)

    結果その1の画面コピー : 他に同一優先度タスク(や高優先度タスク)が無ければ少々低下



    結果その2の画面コピー: 他に同一優先度タスクが1つあれば半分に低下(当然ながら)



    今回、FreeRTOS環境下でCoreMarkベンチマークを実行させたのですが、main()がCoreMarkソースの改変不可ソースに含まれていた関係上、以下のように、main_task()からmain()を呼び出す(赤文字箇所)ことにしました。その為、src/coremarkフォルダ以下のソースは前回投稿したソースから変更無しです。(他方、src/core_config.hは、GNURX側で、最適化オプションの変更によるFLAGS_STRの変更と計測可能時間範囲の事情によるITERATIONSの変更が有ります。)

    src/tb_rx65n_main.c

    void task_CoreMark(void *pvParameters)
    {
        INTERNAL_NOT_USED(pvParameters);

        main(); /* The main() is in the src/coremark/core_main.c */

        for(;;);
    }

    また、今回、同一優先度タスク(青文字箇所)をもう1つ実行させることが出来るように、ソース中に以下の#if~#endif(赤文字箇所)を入れてあります。ここを0→1にすると、同一優先度タスクがもう1つ実行されるようになります。

    src/frtos_startup/freertos_object_init.c

    void Kernel_Object_init (void)
    {
        /************** task creation ****************************/

    #if 0
        ret = xTaskCreate(main_task, "MAIN_TASK", 512, NULL, 1, NULL);
        if (pdPASS != ret)
        {
            while (1)
            {
                /* Failed! Task can not be created. */
            }
        }
    #endif

        ret = xTaskCreate(task_CoreMark, "TASK_CM", 0x1000, NULL, 1, NULL);
        if (pdPASS != ret)
        {
            while (1)
            {
                /* Failed! Task can not be created. */
            }
        }
        ...略...
    }

    src/tb_rx65n_main.c

    void main_task(void *pvParameters)
    {
        INTERNAL_NOT_USED(pvParameters);

        for(;;);
    }

    ちなみに、FreeRTOSのReadmeにGNUARMですが-fltoに関連した記述があった、というのは以下になります。

    FreeRTOS Real Time Kernel (RTOS)
    sourceforge.net/projects/freertos/files/


    Changes between FreeRTOS V10.2.1 and FreeRTOS V10.2.0 released May 13 2019:
    。。。略。。。
    + Introduced the portMEMORY_BARRIER macro to prevent instruction re-ordering
    when GCC link time optimisation is used.
    。。。略。。。

     

  • こんにちは。NoMaYです。

    ウェブでCortexコアのCoreMark値の計測値例を探してみました。なお、TB-RX65N 120MHz+CC-RX V2.03では、このスレッドで以前に私が投稿した計測値例としては、CoreMark値=472.27 (CoreMark/MHz値=3.93 (なお公称CoreMark/MHz値=4.34です)) でした。

    (1) GNUARMでの例

    github.com/PaulStoffregen/CoreMark
    画面コピー(紫文字の書き込みは私によるもの)


    (2) ARMCCでの例

    os.mbed.com/media/uploads/MACRUM/mbed_fest_2013_west_toyowata.pdf
    画面コピー(紫文字と灰色文字の書き込みは私によるもの)


    todotani.cocolog-nifty.com/blog/2014/08/mbed-edca.html
    画面コピー(紫文字の書き込みは私によるもの)


    (3) EWARMでの例

    devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/comparing-compilersides-for-development-with-nrf5x
    画面コピー(紫文字の書き込みは私によるもの)


    www.nxp.com/docs/en/application-note/AN12284.pdf
    画面コピー(紫文字の書き込みは私によるもの)


    www.digikey.jp/ja/articles/techzone/2017/mar/decreasing-cost-time-to-market-professional-embedded-development-tools
    画面コピー(紫文字の書き込みは私によるもの)

     

  • GNURL78 と GNURX 用の新しいのが公開されており、

    Both Renesas RX and RL78 Toolchains Get Refreshed Today (Release 2019q4)

    gcc-renesas.com/.../
    > GCC for Renesas 8.3.0.201904-GNURX

    RX 用は GCC の版が随分上がっています。生成される RX のコードの質が変わっているかは興味があるところですね。
  • こんにちは。NoMaYです。

    fujitaさん、情報有難うございます。新しいGNURXで試してみました。結果は以下の通りでした。(小数点以下3桁目以降は切り捨てです。) CoreMark値(及びCoreMark/MHz値)は2割ほど向上していました。(ただ、-fltoを指定していると動作しなくなってしまいましたので、-fltoは外しました。(印象なのですが、値の計測を終了した後に、結果を出力しようとしたところで(ところから)、何かが起きてしまっているようでした。))

     

    旧GNURX 2019q2(4.8.4.201902)

    新GNURX 2019q4(8.3.0.201904)

    公称値
    コンパイル最適化オプション -O3 -flto -O3
    リンク最適化オプション
      CoreMark CoreMark/MHz CoreMark CoreMark/MHz CoreMark/MHz
    TB-RX130 (RX130 32MHz) 61.38 1.91 73.07 2.28 3.08
    TB-RX231 (RX231 54MHz) 137.11 2.53 165.38 3.06 4.16
    TB-RX65N (RX65N 120MHz) 326.61 2.72 386.70 3.22  4.34

     

  • おゝこれは素晴らしい。正直期待以上の結果でした。