ASMPのCPUアーキテクチャを学ぶ

図
図:Arm Cortex-M4(FPU機能搭載)を6コアによるASMP構成を採用した「SPRESENSE」

▼目次

CPUを理解して高度なシステムを設計しよう

1999年、IBMにより、はじめて商用サーバ向けのプロセッサとしてデュアルコアCPU(2個のCPUコアを搭載)の「POWER4」がリリースされました。CPUコアとは、CPUがメモリから命令を読み出してから、処理するデータをかき集め、計算を行い、データを書き戻すまでの機能を備えたハードウェア・ブロックです。コンピュータを構成する最小の単位となります。

マルチコアプロセッサの登場により、当時の高速化の主流であった「CPUクロック(命令実行時間の基準となる信号)周波数を向上させる」競争が一転。複数の仕事(タスク)を並列にこなすことにより、時間あたりの仕事量を増やす、並列化による高速化競争がはじまりました。「マルチコアをいかにして使いこなすのか」という課題が、コンピュータを進化させる鍵となったのです。

それから20年。現在私たちの生活にはマルチコアプロセッサが当たり前のように溶け込んでいます。スマートフォンはもちろんのこと、小さなウェアラブルデバイスも複数のコアを持っています。素晴らしい技術革新ですが、私たちはマルチコアを意識せずに活用できるため、残念なことにCPUやマルチコアについて学ぶ機会も少なくなりました。その一方で産業分野をはじめ、様々なビジネスを牽引するIoT(Internet of Things)機器の開発では、限られたリソースを最大限に活用するため、CPUアーキテクチャ、マルチコアに関する知識が不可欠です。

APS初心者講座「マルチコア編」では、産業製品開発に欠かせない技術をソニーのSPRESENSEを教材として用い、座学+実機によりわかりやすく解説。実践的なマルチコア活用技術の習得を目指します。一緒に頑張りましょう。

ASMP(Asymmetric Multi-Processing / AMP)

マルチコアのシステムは大別してSMPとASMPの2種類があります

Wikipedia:ASMP,AMP(マルチプロセッシング)

SMP(Symmetric Multi-Processing:対称型マルチプロセッシング)とは、すべてのコアが同等の機能を備えたシステムです。私たちが普段使っているIntel x86 CPUはSMPアーキテクチャのデバイスです。別々のCPUコアであっても、各コア上のプログラムはコア番号を意識することなく処理することができます(CPU間通信やメモリアクセスなど)。

一方、ASMP(Asymmetric Multi-Processing:非対称型マルチプロセッシング)とは、一部のコアが固有の機能やハードウェアを備えているシステムです。あえて同じハードウェア構成としないことにより回路を簡素化。ハードウェア規模を抑えつつ、マルチコアによる並列性を実現します。特定の処理を目的とした「組み込みシステム」に最適化しやすいアーキテクチャと言えるでしょう。

ASMPアーキテクチャの例「SPRESENSE」

ソニーのSPRESENSE(CXD5602)は1個のメインコアがシステムを管理し、5個のサブコアが演算を支援するASMPアーキテクチャを採用しています。メインコアのみが、サブコアに対してメッセージを投げる(タスクを指示する)ことができます。一方、メインコア・サブコアは共通してメモリやペリフェラルへアクセスできるため、信号処理などのアプリケーションの肝となる処理を並列化して実行可能です。SPRESENSE用のリアルタイムOS「NuttX」もメインコア上で動作しシステムを統括、必要に応じてサブコアへタスクを割り当てます。

ASMP構成のプロセッサを使ってみる

ASMPのイメージを具体化してみましょう。SPRESENSE上で複数のタスクを別々のCPUコアで実行するサンプル・アプリケーションを紹介いたします。

Spresense Arduinoマルチコア環境を動かしてみる

このサンプルプログラムでは、1個のメインコアがシステム全体を管理し、4個のサブコア(SubCore1、2、3、4)を制御します。インストール時には、各コアで実行するタスクを別々にビルドし、SPRESENSEの内蔵フラッシュメモリに書きこみます。SPRESENSEは、電源が投入されると、メインコアのプログラムを最初に実行し、メインコアのプログラムは内蔵フラッシュメモリにインストールされている「各コアで実行するためのプログラム」をロード、それぞれのコアに処理を依頼します。各コアのプログラムは、独立に動作しUARTへログを出力、SPRESENSE Main Board上のLED1、2、3、4を点滅させます。

このマルチコアを使うサンプル・アプリケーションは、開発環境のセットアップに25分程度、プログラムを実行するのに5分程度、あわせて30分弱で実行することができます。本初心者講座のゴールは、さらにその先「使いこなす」技術の習得です。

図
図1:マルチコアを使うだけなら、作業時間はわずか30分弱

なおASMPのシステムは、もちろんシングルコアのみを使うアプリケーションも実行できます。この場合はメインコアのみが動作します。下図のカメラアプリケーションは、メインコアでカメラを制御し、撮影した画像をそのままLCDへ表示、SDカードにも記録するプログラムを実行しています。

図

図
図2:単純な撮影ならばシングルコアで十分、もしサブコアで画像処理ができれば…!

コア数とタスク数

コア数とタスク数の関係として、「シングルコア」or「マルチコア」アーキテクチャそれぞれに「シングルタスク」or「マルチタスク」の実行が考えられます。ここでは、それぞれのメリットを紹介いたします。本内容を参考に、自分の開発したいアプリケーションを思い浮かべ、どのようなタスク設計が理想的なのか想像してみてください。

図
図3:コア数とタスク数

シングルコア・シングルタスク

最も単純な構成です。そのため、最もデバッグしやすく、プロトタイピングをしやすい構成と言えます。マルチコア向けのプログラムを開発する際は、焦らず、まずシングルコア・シングルタスクで動くアプリケーションを開発しましょう。

シングルコア・マルチタスク

タスクを時間ごとにコアに割り当て、複数のタスクを実行する方式です。本方式のことを「並行実行」「時分割多重方式」などと呼び、タスクを入れ替えるOSが必要となります。WindowsやLinuxなどの汎用OSが広く採用している方式です。汎用OSはコアを細かい時間単位に分割し、複数のタスクを入れ替えることで、あたかも全てが同時に実行しているように見せかけています。

本方式で注意すべき点は「OSがどのようにタスクを入れ替えるか」のルールを理解しておくことです。リアルタイムOS(RTOS:Real Time OS)を採用するシステムの場合、Windowsのように常時入れ替えず、実行中のタスクが停止しない限り別のタスクに入れ替えないルールを採用することも多くあります。何回発生するかわからない入れ替え操作を排除することにより、最悪実行時間を保証できるためです。

マルチコア・シングルタスク

タスクが時間ごとに異なるコア(もしくは異なる設定で動いている同じコア)で実行される方式です。一見すると不思議な動きですが、瞬間的にコアの動作周波数を上げる、消費電力を抑えたコアで実行する、データが置かれているメモリに近いコアに移動させる、など様々な特性を使い分けることができます。Armの提唱するbig.LITTLEアーキテクチャや、Intelのターボ・ブースト・テクノロジーも本方式の延長上と言えるでしょう。

マルチコア・マルチタスク

複数のコアを活用して、アプリケーションを構成する様々なタスクを並列に実行していく理想的なアーキテクチャです。ただし「より効率的な組み合わせでタスクを並列実行する」必要があるため、最も設計の難しいアーキテクチャとも言えます。SPRESENSEをはじめとするASMPでいかにタスク設計をすべきか、本初心者講座で学んでいきましょう。

図
図4:初心者講座を通してマルチコアへの理解を深めましょう

まとめ

いかがだったでしょうか。初心者講座「マルチコア編」第1回として、ASMPをはじめとするCPUアーキテクチャや、コアとタスクの関係について紹介しました。次回はASMP上でタスク設計する方法と、設計時に注意すべきポイントについて解説いたします。是非、ご期待下さい。

よりマルチコアを理解いただくためのAPSの取り組み

APSでは、初心者講座マルチコア編を通じて、より深く技術を習得いただくための教材「APS学習ボード(SPRESENSE™ Extension Board用)」を準備しています。回路設計をすることなく、簡単にASMPのアーキテクチャを動かしながら学ぶためのプラットフォームです。是非ご活用ください(2019年夏リリースを計画しています)。