APS初心者講座マルチコア編では、これまでSPRESENSEを題材にASMP構成のCPUアーキテクチャについて紹介してきました。ASMPのアーキテクチャは、中核をなす制御用のCPUコアが搭載され、それを取り巻くように高速化つまり特定処理に特化した処理を担当するCPUコアを配置した構成を採っています。ASMPアーキテクチャのシステムは、Intel CPUなどPC等で一般的に採用されているSMPアーキテクチャのシステムに比べ、組み込み製品に求められる厳格なスケジューリングを記述できることやソフトウェア・アクセラレータを実装しやすいといったメリットがあります。
さて、このように多数の魅力を備えながらもASMP構成でシステムを構築できるSPRESENSE SDKですが、v2.0.0のアップデートに伴い、内蔵しているリアルタイムOS「NuttX」が8.xにバージョンアップし、SMP構成のシステムも構築できるようになりました(図1)。そこで今回の初心者講座では、SMP構成の特徴と、SMP×ASMPで構成するハイブリッドなシステムが、なぜ開発にメリットを与えるのかを紹介。さらには、SPRESENSE SDKに内蔵されているNuttXからSMP機能を有効化し、実際に動作する様子とその手順を解説いたします。ASMPアーキテクチャの復習とSMPアーキテクチャの学習に、本記事を是非ご活用ください。
目次
SMPアーキテクチャの基礎を理解する!
SMPアーキテクチャは、その構成として制御対象となるCPUコアを対等に扱い(全CPUコアが6個、SMP対象のCPUコアが2個の場合、その2個を対等に扱うこと)、アプリケーションはもちろんOSカーネルなどのプログラムの実行を各CPUコアに分担させることで並列処理を実現します。
ASMPアーキテクチャとSMPアーキテクチャの違い
SMPアーキテクチャは、ASMPアーキテクチャのように全体を制御するメインコアが1つ存在し、サブコアはメインコアの指示によって動作するものではありません(図2)。SMP構成のCPUコアは、自発的にスケジューラを実行。スケジューリング・キューに格納された(enqueueされた)タスクのうち、実行可能状態であるものを取り出し(dequeueし)、自身のCPUコア上で新しい処理を開始します(図3)。事前に実行時間を見積ることなくプログラムの動作順序を実行中に決定する方式であることから、実行時間が変化しやすいプロトコルスタックやファイルシステムを実行する状況であってもCPUリソースを遊ばせることなく次の処理を開始できます。ネットワークやストレージへのアクセスが頻出する、近年高い人気を誇るリッチな組み込みゲートウェイや、データレートが異なる様々なセンサーを統合しなければならないセンサーハブ等の実現に適したCPUアーキテクチャです。
スケジューリング・ポリシー
空いたCPUにどのプログラムを割り当てるかの決定方法をスケジューリング・ポリシーと呼びます。最も簡単なスケジューリング・ポリシーはFirst-In-First-Out(FIFO)スケジューリングです。FIFOスケジューリングは、先着順に処理を開始し、実行中の処理が実行待ち状態へと遷移した場合に、次の処理をスケジューリング・キューから探査・実行します。一方、ラウンドロビン・スケジューリングは、汎用システムにおいて広く使われているスケジューリング・ポリシーです(図4)。CPUの実行時間をタイムスライスという単位に分割し、タイムスライスが終わるごとにスケジューラーがスケジューリング・キューから新しい処理を取得/CPU上での実行を開始させます。タイムスライスを超過した処理は、次の実行機会を待つために再度スケジューリング・キューへ格納されます。
ハードリアルタイム性とラウンドロビン・スケジューリング
ラウンドロビン・スケジューリングは、CPUをすべてのタスクが平等に利用するため、最良のスケジューリングポリシーに見えますが、リアルタイム性を担保しなければならないシステムにおいては欠点となります。システムのタスク数が増加することにより、タスク開始から終了までの時間が他のタスクの割り込みにより増大するため、最悪実行時間を確実に保証しなければならないハードリアルタイム性が求められるシステムには採用できません。タイムスライスの長さや、タスクの優先度設計により解決できたように錯覚することもあるため、設計する際には十分な注意を払う必要があります。
Round Robin scheduling – Wikipedia
組み込み製品に最適なアーキテクチャ、SMP×ASMP構成のハイブリッドシステムの特長とは!
以上の内容から、近年の組み込みシステムには『ASMP』によるソフトウェア・アクセラレーション機能だけでなく、ネットワークやストレージの管理に最適な『SMP』の概念も取り入れた方が良い、ということを感じていただけたと思います。一方で、各社が開発する組み込みシステムは千差万別であることから、SMP構成/管理用のメインコアと、ASMP構成/アクセラレーション用のサブコアを、いくつずつ準備すべきかを決めることは非常に難しい問題です。また、組み込みシステムがネットワークとの連携を強めたり、処理しなければならないデータのスループットが増加することにより、管理用とアクセラレーション用にいくつコアを割り当てるかといったストラテジーを検討する必要があります。このように流動的なSMP×ASMP構成のシステムを構築できるのがSPRESENSEです。
SPRESENSEは、SoCのApplication Domainに含まれている6個のCortex-M4コアを、SPRESENSE SDKに同梱されているRTOS「NuttX」のソフトウェア設定を変更するだけで、SMPとASMPへのコア割り当て数を変更することができます(図5)。そのため、近年AI×IoT業界で主流となっているハードウェアを長期運用しつつ、ソフトウェアのアップデートによりスマートに成長する付加価値の高い製品を開発することができます。なお、第10回「SPRESENSEの消費電力を可視化して解析」でも紹介しました、SPRESENSEにおける未使用のCPUコアは自動的に電力が遮断されることから、2コアをSMP、3コアをASMP、1コアを休眠させるといった利用方法も簡単に実現可能です。
あわせて読みたい
RTOSも実行できるSMP構成のCPUコア|システム全体を最適化できる
v2.0.0以前のSPRESENSE SDKにはSMP機能が搭載されていなかったため、RTOS「NuttX」を実行できるCPUコアは1個のメインコアに限定されていました。そのため、NuttXに内蔵されているネットワーク処理(プロトコルスタックの実行)やファイル操作(ファイルシステムやストレージドライバの実行)はすべて1コアで処理を行う必要がありました。
近年のIoTのシステムは、大量のデータを採取し、そのデータをサブコアで圧縮/標本化/量子化/メタデータ変換、メインコア上のNuttXのファイルシステム機能とストレージドライバにより収集した情報を保管。その後、適切なタイミングでメインコア上のNuttXのプロトコルスタックとネットワークドライバによってサーバー/クラウドへ情報を展開する、といったシステムが要件となります。こうした課題に対してSPRESENSEは、SMP×ASMP構成により、従来のデータ解析はASMP構成としたCPUコアで高速実行、ストレージやネットワーク制御といったRTOSが必要な処理はSMP構成としたCPUコアにより並列化することで、大幅な性能向上を達成、CPUリソースの空き時間が増えることにより省電力化も実現可能です(図6)。
SPRESENSEでSMP×ASMP構成のシステムを体験しよう!
本節では、これまでのSPRESENSE SDKの初期設定となっていたASMP構成(メインコアx1、サブコアx5)から、SPRESENSE SDK v2.0.0より有効となったSMP機能によるSMP×ASMP構成(メインコアx2、サブコアx4)へと切り替える手順を紹介いたします。本動画はSPRESENSE SDK v2.0.2(2020年10月現在最新)のインストールから掲載しています。既に開発環境をインストールされている方は、お手元の開発環境にあわせて必要な手順をピックアップし、ご活用ください。
SPRESENSE SDK v2.0.2を入手し、ASMP構成でRTOSをビルド、実行する
まず、MSYS2上をインストールし、SPRESENSE SDKを入手し、Visual Studio Code統合開発環境を準備します。
SPRESENSE VSCode IDEのセットアップ|SPRESENSE SDK スタートガイド(IDE)
- MSYS2をインストールします。
- MSYS2上でinstall.shをダウンロードして実行しSPRESENSE SDKに必要なツールをインストールします(図7)。
- gitコマンドを使ってSPRESENSE SDKをダウンロードします。
- SPRESENSEとPCの接続に使うデバイスドライバ「CP210xデバイスドライバ」をインストールします。
- Visual Studio Codeに拡張機能「Japanese Language Pack」をインストールします。
- Visual Studio Codeに拡張機能「Spresense VSCode IDE」をインストールします。
- Visual Studio CodeにMSYS2へのパスを設定します。
アプリケーションプロジェクトの作成|SPRESENSE SDK スタートガイド(IDE)
- プロジェクトを作成し、SPRESENSE SDKフォルダを指定し、作業用フォルダを作成/登録します。
- SDKコンフィグを開始し、新規作成を選択。特に項目を加えず、保存をクリックします。
※本操作によりメインコアが1個、サブコアが5個のASMP構成がsdk.configに保存されます。 - アプリケーションを追加し、アプリケーションをビルドします。
※本操作によりメインコアが1個、サブコアが5個のASMP構成としてシステムを制御するRTOSがビルドされます。 - ビルトと実行の操作を行うことによりプログラムがSPRESENSE上にて起動します。
SMP構成へ切り替えるため、ビルド生成物をすべて削除する
続いて、SPRESENSEをSMP構成(複数のメインコア構成)で動作させていきましょう。SMP構成で動作させるためには、システム全体を制御するRTOSの設定を変更・ビルドしなおし、CPUコアの管理方法を変更する必要があります。また、すベてのアプリケーションはRTOSの実行ファイルに紐づくようビルドされているため、アプリケーションも再ビルドする必要があります。ここでは前手順により生成されたビルド成果物の削除手順を紹介いたします。
- Visual Studio Code上でアプリケーションのクリーンを実行します。
- Visual Studio Code上でプロジェクトに含まれているsdk.configを右クリックし、削除します。
※本操作によりメインコアが1個、サブコアが5個がASMP構成のsdk.configが削除されます。
ターミナルの開き方|SPRESENSE SDK スタートガイド(IDE)
Spresense SDKをクリーンアップする|SPRESENSE SDK スタートガイド(IDE)
- 「ターミナル」-「新しいターミナル」をクリックし、画面下部にMSYS2のターミナルを表示します。
- ターミナル上で “cd ~/spresense/sdk” と入力し、SPRESENSE SDKのフォルダへ移動します。
- “make distclean”を実行し、ビルド済みのRTOSを削除します(図8)。
※本操作によりメインコアが1個、サブコアが5個のASMP構成のRTOSが削除されます。
SMP×ASMP構成のサンプルアプリケーションをロードする
ここまで準備ができましたら、早速メインコアを複数備えたSMP×ASMP構成のシステムをビルドしていきましょう。最も簡単にSMP×ASMPの動作に必要な設定を行う方法は、Examplesに含まれているsmp_asmpの設定値をロードすることです。
- Visual Studio CodeにてSDKコンフィグを開始します。
- 新規作成をクリックし、Examples/smp_asmpを選択し、保存をクリックします(図9)。
- 「RTOS Features」-「Task and Scheduling」でSMPが有効になっていることを確認できます(図10)。
※SMP構成で動作させるためにはSMPを有効化するだけでなく、関連するパラメータの調整が必要となります。
※設定値の入力ミスや入力漏れなくSMPを動作させるには、まず smp_asmp の設定情報をロードし、そこから値を調整すると簡単です。
SMP×ASMP構成のサンプルアプリケーションをビルドし、実行する
最後に、アプリケーションをビルドし、ビルドと実行を行うことでSMP×ASMP構成でCPUを管理するRTOSと、SMP×ASMP構成の動作を確認するためのサンプルプログラムがSPRESENSE上へ転送されます。SPRESENSE SDKはサンプルプログラムとして「smp」と「ostest」を提供しています。サンプルプログラム「smp」(図11)は、SMP構成のCPUコアとASMP構成のコア4個(プログラム上ではthreadと表記)を同期するプログラムです。はじめてSMPの動作を確認するためのサンプルとしてオススメのプログラムです。サンプルプログラム「ostest」にはRTOSの設定や動作を確認するためのプログラムです。自身がSDKコンフィグ内の「RTOS Configuration」で設定した内容が反映されているかどうかを確認する際などにご活用ください。
まとめ
今回の初心者講座では、SMPアーキテクチャとASMPアーキテクチャの差異をはじめ、それぞれのメリットと、SMP×ASMPを共存させることより実現可能なリッチな組み込みシステムの例を見ていただきました。またSPRESENSE SDKを使うことにより、Cortex-M4を核とする超低消費電力の組み込みシステム上でSMP×ASMP構成の基盤を、非常に簡単に構築可能であることも体感いただけたかと思います。次回はSPRESENSEのアプリケーションをひとつ例に取り挙げて、近年組み込みシステムに求められているコンポーネントの一部を解説いたします。
こちらも是非
“もっと見る” マルチコア|SPRESENSE編
SPRESENSE×Neural Network Console:第4回|推論モデルを最適化し、エッジAIによるオリジナルの音声識別システムを構築する
今回の初心者講座では、SPRESENSEの「ハイレゾオーディオ入力」と「DNNRT機能」により「Neural Network Console」で生成したディープニューラルネットワーク(DNN)の推論モデルを統合。エッジ単体で完結するオリジナルの音声識別システムを構築する技法を解説いたします。
SPRESENSE×Neural Network Console:第3回|オーディオ解析に必要な学習用データを採取し、PC上で学習・推論を実行する
今回の初心者講座では、SPRESENSEに搭載されたハイレゾオーディオ入力を活用し、環境音を録音し、ディープニューラルネットワークによる音声分類に不可欠な学習用データと検証用データを生成する方法について解説します。また、PC上で動作するNeural Network Consoleによって生成した推論モデルをエッジ・デバイスへ統合するために解決すべき課題を紹介します。
SPRESENSE×Neural Network Console:第2回|異常検知に活用できるニューラルネットワークで波形の扱い方を学ぶ
SPRESENSEのDNNRT機能が扱うことのできるデータは画像だけでなく、産業分野を中心に人気が高まっている「異常検知・故障予知」に活用できる加速度センサーや大気圧センサーなどから収集した波形データも解析することができます。さらにSPRESENSEに内蔵されたハイレゾオーディオ録音機能も周辺環境を可聴域の波形データとして記録することができる優れたセンサーとして利用可能です。そこで、今回の初心者講座では、まず簡単な波形データの解析方法を例に、DNNRT機能から波形データを扱うシステムの構築方法について解説。DNNRT機能を活用した製品開発に必要となる技術を紹介いたします。