当社でも販売開始した、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をクリックします。
画面に処理時間を表示するために、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に変更します。
メニューのプロジェクト-(プロジェクト名)のプロパティを実行して、DebugにあるTarget deviceをリモートコンピューターに変更、FindからJouleデバイスを選択します。
メニューのデバッグ-デバッグの開始を実行すると、プログラムがビルドされ、Jouleへデプロイ、Joule上でプログラムが実行します。
2.4 JOULEとRASPPI3の処理時間を比較
JouleとRaspberry Pi 3のそれぞれで、DebugビルドとReleaseビルドで動かしてみました。表示された値が結構ばらついていたのですが、Device PortalでSoftAPをdisableにしたところ、ばらつきが減りました。
画面は、JouleのReleaseビルド実行したときのもの(簡素な画面でスミマセン)。
画面に表示されている処理時間を、Excelに打ち込んで表、グラフにしたものが次のとおりです。
Debugビルドは約1.7倍と、まぁこんなものかなといった感じですが、Releaseビルドは約3.3倍も高速に!ちょっとビックリな結果でした。
2.5 あとがき
今回、試したプログラムが短かったので、CPUとキャッシュに大きく依存してしまったと思います。RAMやFlashが高性能なので、画像処理とか差が出やすいのではないでしょうか。このあたりもどれくらいの差が出るのか確認したいところです。
実際にプログラムをデプロイ、実行してみて、いくつか感じたことがありました。
- Jouleは、電源投入してからOSが起動完了するまでの時間が短い(eMMCの恩恵?)。
- Visual StudioからJouleへのデプロイ、実行開始するまでの時間が短い(今回、Jouleは5GHz、RaspPi3は2.4GHzでWi-Fi接続したので、その影響か)。
- Jouleのヒートシンクが想像していたよりも熱くなる(放射温度計で40℃くらい)。
これらは追って確認したいと思います。
第一回:Jouleを動かしてみました
第二回:Jouleは本当に速いのか(当記事)