
最近、組込み関連の展示会やニュースで、GPUやFPGAに関する話題が増えてきました。実際、これまでマイコンが実行していた処理を、こうしたチップに割り振った組込みシステムが、次々と登場しています。
こうした動きは、組込みシステムを開発しているエンジニアや、マイコンの上で動くソフトウエアを開発しているプログラマにとって、無関心ではいられません。将来の仕事や、そこで求められるスキルを一変させる可能性が高いからです。そこで今回は、この2つのチップの動きと、新しい組込みシステム開発の姿についてお話ししようと思います。
そもそもGPUとFPGAって何?
既にご存知の方も多いでしょうが、GPUとFPGAそれぞれについて、簡単におさらいしておきます。両方共に、組込みシステムで慣れ親しんできたマイコンの中にあるマイクロプロセッサ・コアとは、違った構造と特徴を持ったプログラマブルデバイスです。
GPU(Graphics Processing Unit)は、グラフィックス処理や画像処理に適した内部構造を持つプロセッサです(図1)。乗算器や加算器を、並列にたくさん並べた構造を採っています。元々、パソコンなどで演算負荷の高くなりがちなグラフィックス処理を、マイクロプロセサの性能を割くことなく実行できるアクセラレータとして登場しました。現在でも、3次元グラフィックス・ゲームなどを快適に動かす高性能パソコンや、大きな設計データを扱うCADを動かすワークステーションなどに、強力なGPUが搭載されています。

FPGA(Field Programmable Gate Array)は、特定処理の専用ハードウエアを、プログラムを書き込むことで自由に構成できるデバイスです(図2)。
ロジックセルと呼ぶ、簡単にいえば掛け算九九の表のような演算早見表をたくさん並べ、それらを配線で相互接続した内部構造を採っています。演算早見表の内容と配線のルートをプログラムで指定することで、超並列の演算回路でも、マイクロプロセッサやGPUでも、自由自在に作ることができる万能チップです。
ただし、自由度の向上を第一に考えた構造であるため、チップ内の構造を余すことなく使い切ることが難しく、無駄が多くなりがちなチップでもあります。マイコンの周辺に置くASICの開発で、設計データをブラッシュアップするために使う試作用チップとして、お馴染みの組込みエンジニアも多いと思います。

かつての脇役が、今では主役
元々、GPUはマイクロプロセッサを補助する役割、FPGAはシステム開発を円滑に進める役割と、どちらかと言えば脇役を努めていたと言えます。ところが今や、この2つのチップは、システムの進歩を堂々と引っ張っていく、主役を張る存在に成長しました。
例えば、GPUは、科学技術計算やシミュレーション、金融計算など同じ処理を大量に繰り返す必要のある仕事のエンジンとして使われています。こうした汎用性の高いGPUは、GPGPUと呼ばれています。FPGAも、データセンターで大量のデータを対象にして高速に検索処理するためのエンジンとして使われるようになりました(図3)。そして何と、今注目の的である人工知能システムでも、その主役はGPUとFPGAです。もはやマイクロプロセッサの方が、脇役に見えるほどです。

そしてその波は、組込みシステムの分野にも及んできました。自動運転車の前段階と言える高度運転支援システム(ADAS)では、カメラで取り込んだ画像を処理して、そこに映っているものがどこにあり、何なのか認識する処理を、GPUやFPGAが実行するようになりました(図4)。自動車メーカーや電装メーカー各社が、こぞってGPUもしくはFPGAをベースにして、ADASと、その先にある自動運転車の開発を進めています。

黄昏の時を迎えるマイクロプロセッサ
かつての脇役が、どうして主役を演じるようになったのでしょうか。理由は、大きく2つあります。ひとつは、マイクロプロセッサの性能向上が困難になったこと。もう一つは、特にGPUやFPGAが得意な処理で、高性能化の要請が高まっていることです。
3年位ぶりにパソコンを買い換える時、最新の製品に搭載されているマイクロプロセッサの動作周波数を確認して、手持ちの旧機種に搭載されているものとほとんど変わっていないことに驚いた経験がある人も多いのではないでしょうか(図5)。動作周波数は、チップの性能に直結する指標です。もちろん、内部構造の改善によって、性能は向上しているのですが、その向上幅は限定的で、ベンチマークを見ると得意な処理と不得意な処理の明暗がハッキリ分かれています。かつてのように、あらゆる処理を高速化する万能の性能向上ができなくなったのです。
どうしてこのような状態になってしまったのでしょうか。動作周波数を上げると、動作を不安定にしたり、チップ自らを破壊してしまうほどの発熱が起きてしまうようになったからです。これは、微細なトランジスタレベルの解消不能な問題であり、動作周波数を一定値に抑える以外の対策がありません。

マイクロプロセッサの性能向上が頭打ちになったことは、IoTと人工知能を駆使してビッグデータをバリバリ処理する、高度なシステムを開発したいエンジニアを途方に暮れさせる一大事です。でも安心してください。システムの高性能化は可能です。これから高い演算性能が求められる用途には、一定の特徴があるため、万能の性能向上は不要なのです。
マイクロプロセッサは、処理した出力を次の処理の入力に使う逐次処理に強い構造を採っています。前の処理の出力とその後の処理の入力の連鎖が多ければ多いほど、その強みが際立ちます。ソフトのプログラミング言語自体が、逐次処理を前提にして開発された技術なのですから当然です。しかし今、高い演算性能が求められている処理は、出力と入力の連鎖は程々で、同じ処理を同時並行的に大量に処理するようなものが多いのです。画像処理やニューラルネットワーク内での処理で多用するフィルタ処理は、その典型的な例です。
こうした処理の実行に、並列度を高めやすいGPUやFPGAの構造が、バッチリはまります。もちろん、マイクロプロセッサでもマルチコア化すれば、こうした処理を高性能化できますが、その構造はどんどんGPUに近づきます。逐次処理に高度な要求がないのなら、無理せずにGPUやFPGAを使った方が、はるかに効果的です。
GPUやFPGAを使いこなせ
GPUやFPGAが主役になる時代、組込みエンジニアの仕事はどのように変わっていくのでしょうか。まず最初に強調しておきたいことは、マイクロプロセッサを搭載したマイコンをプログラムする作業は、これからもなくならないということです。システム全体の動きを複雑な逐次処理で制御する機能は、必ず必要だからです。ただし、高度なシステムを開発するための焦点は、GPUやFPGAの使いこなしへと移っていくでしょう。
近年では、GPUの機能を強化したマイコンや、ARMやx86プロセッサのコアを搭載したFPGAも登場しています。組込みシステムの開発では、GPUやFPGA単独のチップだけではなく、こうしたチップの活用も進むと思われます。
システム開発の指針や、プログラミングの方法も大きく変わります。
これまで開発要件に合ったシステムを開発する時、盛り込むべき機能を、ソフトで実装する部分とハードで実装する部分に切り分ける作業の上手い下手が、完成品の価値に大きく影響しました。この点は、これからも重要です。ただし、GPUやFPGAが主役の時代には、ソフトで実装する部分を、さらに逐次処理重視と並列処理重視の機能に切り分けて、マイクロプロセッサに割り当てるのか、GPUやFPGAに割り当てるのか決める作業がとても重要になります。さらにFPGAを使う場合には、ハードで実装する部分も、性能やコスト重視の機能と柔軟に仕様変更できる機能に切り分け、専用チップに割り当てるのか、FPGAに割り当てるのか決める必要があります。
プログラミングでは、GPUを使う場合にはNVIDIA社が開発した並列処理に向けた標準的な汎用Cコンパイラ環境「CUDA」など、FPGAを使う場合にはC言語ベースのヘテロジニアス(違った種類のプロセッサを混在利用する)コンピューティング環境向け標準規格「OpenCL」をいち早く使いこなせるようになる必要があるでしょう(図6)。

これからは、マイコンのプログラムだけでは、価値の高い組込みシステムの開発はできなくなると考えた方がよいと思います。CUDAは、NVIDIA社が大学や研究機関に早い時期から提供していたことが功を奏して、人工知能研究者の業界標準の開発環境になりつつあります。ただし、NVIDIA社のGPUに最適化されているため、プログラムを実装するチップの選択肢は狭くなる傾向があります。
一方、OpenCLは、NVIDIA社のGPUを含めた多くのGPU、そしてFPGA向けのプログラムを開発できる、その名が示すようにオープンな規格です。FPGAの大手2社、Xilinx社とAltera社のそれぞれが、OpenCLを使ってFPGAをプログラミングするためのツールを提供しています。こうしたツールでは、OpenCLで記述したプログラムをFPGA用に変換するとともに、FPGAをOpenCL対応デバイスとして動作させるために必要な周辺ロジックも出力します。これらを、FPGAを搭載したボード上に用意した「BSP(Board Support Package)」と呼ぶテンプレートにはめ込めば、プログラムを実行できるようになります。BSPは、FPGAメーカーやOpenCL対応FPGAデバイスを作っているサードパーティベンダが、ドライバとともに提供しています。
これまでFPGAのプログラミングでは、ソフト開発用の言語とは明らかに異質な、ASIC設計などに利用するハードウエア記述言語(HDL)を覚える必要がありました。それに比べれば、かなり敷居が下がっていると言えます。FPGAを扱えるエンジニアは、Google社やMicrosoft社、Baidu社、ドワンゴなどクラウドサービスの事業者を中心に引く手あまたの状況です。GPUもFPGAも、その使いこなしに向けたスキルアップは、早ければ早いほどよいと思います。
-
- 第1回 組込みシステムのこれから
- 第2回 IoTの成功はセキュリティ次第
- 第3回 組込みでもGPUやFPGAと早めに親しんでおこう
- 第4回 電子産業の紅白歌合戦、CEATECで垣間見えた未来
- 第5回 小口開発案件の集合市場、IoTの歩き方(上)
- 第6回 小口開発案件の集合市場、IoTの歩き方(下)
- 第7回 徹底予習:AI時代の組込みシステム開発のお仕事
- 第8回 いまどきのセンサー(上):ありのままの状態を知る
- 第9回 いまどきのセンサー(下):データを賢く取捨選択する
- 第10回 組込みブロックチェーンの衝撃(上)
- 第11回 組込みブロックチェーンの衝撃(下)
- 第12回 エネルギーハーベスティングの使い所、使い方
- 第13回 「人を育てる」から「道具を育てる」へ、農業から学ぶAI有効活用法
- 第14回 CPS時代に組込みシステム開発に求められることとは
- 第15回 次世代車のE/Eアーキテクチャに見る組込みの進む道
- 第16回 RISC-Vが拓く専用プロセッサの時代
- 第17回 振動計測の大進化で、熟練エンジニアのスキルを広く身近に
-
- 零の巻:組込みというお仕事
- 壱の巻:2進数と16進数を覚えよう!
- 弐の巻:割り込みとポーリング
- 参の巻:printf()が使えない?
- 四の巻:これにもIntelが入ってるの?
- 五の巻:Endianってなに?
- 六の巻:マルチタスクとは
- 七の巻:スタックってなあに?(1)
- 七の巻:スタックってなあに?(2)
- 八の巻:メモリを壊してみましょう
- 九の巻:コードが消える?~最適化の罠~
- 拾の巻:例外が発生しました
- 拾壱の巻:コードサイズを聞かれたら
- 拾弐の巻:キャッシュは諸刃の剣
- 拾参の巻:デバイスにアクセスするには
- 拾四の巻:セキュリティってなに?(1)
- 拾四の巻:セキュリティってなに?(2)
- 拾四の巻:セキュリティってなに?(3)
- 拾五の巻 :DMA対応と言われたら(1)
- 拾五の巻 :DMA対応と言われたら(2)
- 拾六の巻:ヒープとスタック
- 拾七の巻:フラグメンテーション
- 拾八の巻:CPU起動とブートローダ
- 拾九の巻:kmとKByteの「kとK」
- ビリーへの質問:DMAとキャッシュの関係
- ビリーへの質問:スタックオーバーフローについて
- ビリーへの質問:CPUレジスタについて