Joule 570x developer kitを使ってみました。【第二回】

投稿者:

当社でも販売開始した、Intel社の最新IoTモジュール開発キットJoule 570x developer kitですが、先立ってサンプルを入手したので、アルバイトさんに渡して動作記事を書いてもらいました。

第一回の記事はこちらをご覧ください。

第二回のテーマは、Jouleの処理速度について、です。価格帯が違う製品ではありますが、Raspberry Pi 3と比較しています。


2 Jouleは本当に速いのか

Jouleは1.5 GHz/1.7 GHzの64 bitクアッドコアを搭載しており、Raspberry Pi 3の1.2 GHzの64 bitクアッドコアよりも速そうです。また、RAMやFlashも高性能のようです。

今回は、Windows 10 IoT Core上で計算プログラムを実行してみて、Joule 570xとRaspberry Pi 3の処理時間を比較してみましょう。

2.1 JouleとRaspPi3の仕様を確認

実機で動かす前にJouleとRaspPi3の仕様を比較しましょう(ついでにRaspPi2も)。

Jouleの仕様は、Datasheet for Intel Joule Compute Moduleに詳しく書かれていましたので、そこから抜粋しました。RaspPi2/3の仕様は、Googleで検索しても見つからなかったので、いくつかのWebサイト(主にRaspPi公式フォーラム)から正しいと思うものを抜粋しました。

Joule 570x Raspberry Pi 3 Raspberry Pi 2
CPU Intel Atom
クアッドコア 1.7 GHz
Broadcom BCM2837
Cortex-A53
クアッドコア 1.2 GHz
Broadcom BCM2836
Cortex-A7
クアッドコア 900 MHz
キャッシュ 4 MB L1 32 KB L1
512 KB L2
32 KB/core L1P
32 KB/core L1D
512 KB L2
RAM 4 GB
LPDDR4 3200 MT/秒
4レーン
1 GB
LPDDR2 900 MHz
1 GB
LPDDR2 450 MHz
Flash 16 GB
eMMC 5.0 400 MB/秒
microSD microSD

CPUクロック数を比較するとJouleが約1.4倍。ただ、インテルアーキテクチャとARMアーキテクチャと大きく違うので、その差がどれくらいあるのか見当がつきません。

CPU以外の部分でも大きく違いが見受けられました。Jouleはキャッシュが桁違いに多く、かつ、RAMがLPDDR4の4レーンであり、かなり速く動くのではないかと期待大です。

2.2 計算プログラムを作る

IoT Core上で動かす計算プログラムを作りましょう。

使用するOSやツールのバージョンは下表のとおりです。

パソコン Joule 570x Raspberry Pi 3
Windows Windows 10 Version 1607 - -
Visual Studio Visual Studio Community 2015 Update 3 - -
IoT Core - Windows 10 IoT Core
10.0.14931.1000
Windows 10 IoT Core
10.0.14393.187

パソコンでVisual Studio 2015を起動して、メニューからファイル-新規作成-プロジェクトを実行、Blank App(Universal Windows)を選んでOKをクリックします。そして、Target VersionにBuild 14393を指定してOKをクリックします。

4

5

画面に処理時間を表示するために、MainPage.xamlのGrid内にListBoxを追加します。

MainPage.xaml(一部)
    
        
    

続けて、MainPage.xamlのPageにLoadedイベントハンドラを追加します。

MainPage.xaml(一部)

MainPage.xaml.csにPage_Loadedメソッドが無い場合は、追加してください。

MainPage.xaml.cs(一部)
        private void Page_Loaded(object sender, RoutedEventArgs e)
        {

        }

計算プログラムは、こちらのフィボナッチ数を求める処理を使うことにしました。C#コードが掲載されているのでコピー&ペースト。

Loadedイベントハンドラで単純にforループして動かしたところ、IoTCoreがUIスレッドが長時間ブロックしていることを検知して(?)UWPアプリを強制終了してしまうので、Task.Runで別スレッドを起動して計算するようにしました。

MainPage.xaml.csにコードを追加して、下記のようにします。

MainPage.xaml.cs(一部)
using System.Threading.Tasks;
using System.Diagnostics;
…
        private async void Page_Loaded(object sender, RoutedEventArgs e)
        {
            List.Items.Add("");
            var sw = new Stopwatch();
            for (int i = 0; i < 10; i++)
            {
                int val = 0;
                await Task.Run(new Action(() =>
                {
                    sw.Restart();
                    val = fib(38);
                    sw.Stop();
                }));
                List.Items.Add(sw.ElapsedMilliseconds);
            }
        }

        private static int fib(int n)
        {
            if (n < 2) return n;
            return fib(n - 2) + fib(n - 1);
        }

2.3 Joule/RaspPi3で実行

メニューのビルド-構成マネージャーを実行して、アクティブソリューションプラットフォームをJouleの場合はx64、RaspPi3の場合はARMに変更します。

6

メニューのプロジェクト-(プロジェクト名)のプロパティを実行して、DebugにあるTarget deviceをリモートコンピューターに変更、FindからJouleデバイスを選択します。

7

メニューのデバッグ-デバッグの開始を実行すると、プログラムがビルドされ、Jouleへデプロイ、Joule上でプログラムが実行します。

2.4 JOULEとRASPPI3の処理時間を比較

JouleとRaspberry Pi 3のそれぞれで、DebugビルドとReleaseビルドで動かしてみました。表示された値が結構ばらついていたのですが、Device PortalでSoftAPをdisableにしたところ、ばらつきが減りました。

画面は、JouleのReleaseビルド実行したときのもの(簡素な画面でスミマセン)。

joule-release

画面に表示されている処理時間を、Excelに打ち込んで表、グラフにしたものが次のとおりです。

1

2

3

Debugビルドは約1.7倍と、まぁこんなものかなといった感じですが、Releaseビルドは約3.3倍も高速に!ちょっとビックリな結果でした。

2.5 あとがき

今回、試したプログラムが短かったので、CPUとキャッシュに大きく依存してしまったと思います。RAMやFlashが高性能なので、画像処理とか差が出やすいのではないでしょうか。このあたりもどれくらいの差が出るのか確認したいところです。

実際にプログラムをデプロイ、実行してみて、いくつか感じたことがありました。

  1. Jouleは、電源投入してからOSが起動完了するまでの時間が短い(eMMCの恩恵?)。
  2. Visual StudioからJouleへのデプロイ、実行開始するまでの時間が短い(今回、Jouleは5GHz、RaspPi3は2.4GHzでWi-Fi接続したので、その影響か)。
  3. Jouleのヒートシンクが想像していたよりも熱くなる(放射温度計で40℃くらい)。

これらは追って確認したいと思います。


第一回:Jouleを動かしてみました
第二回:Jouleは本当に速いのか(当記事)