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です。




Parents
  • こんにちは。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.
    。。。略。。。

     

Reply
  • こんにちは。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.
    。。。略。。。

     

Children
  • 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 のコードの質が変わっているかは興味があるところですね。