マルチコアに対してよく聞かれる質問です。第12回で書いたように、マルチタスクで記載されたプログラムはマルチコアでそのまま動作する可能性はありますが、そうでないプログラムはそのままでは一つのコアでしか動かないため、自動もしくは手動での並列化が必要です。
いずれの手段を取るにしても、これまで一つのコアで順番に動いていた処理が同時に動くようになるため、いくつかのルールを守らないと動作結果やふるまいが「そのまま」ではなくなる場合があります。
次の動画では、これらの観点から質問に答えています。
なお、すべての動画はEMCのYouTube動画ページからご覧いただけます。
今回はマルチコアで動作するソフトウェアについて説明します。
マルチコアといっても、GPUなどを使うヘテロジニアス・マルチコアについては概念が異なってくるので別の機会に譲り、今回はCPUマルチコアについてのみ考えます。
CPUマルチコアで動作するソフトウェアを書くことは、第10回(リンク)で説明した図(下に再掲)をプログラムにすることになります。これを並列化プログラミングとよびます。下の図で、上段はソースコードでのイメージと依存関係のグラフ、中段はシングルプロセッサにおける実行、下段はマルチコア上での実行イメージで、黒く塗りつぶした四角はコア間通信です。並列化プログラミングは、上段のプログラムから下段の実行になるようにすることです。なおここで、マルチコア上での実行には、静的スケジューリングにより各処理の実行コアまで決める方法と、OSなどの動的スケジューリングに任せる方法とがあり、下では簡単に区別します。
前回、一つのアプリケーションの例を用いてマルチコア性能向上の概算手法について説明しました。今回はシステムになったとき難しくなる理由について説明します。
前回の概算手法は、下の図のような実行に対し、各処理の実行時間と、コア間通信やループ並列化のオーバーヘッドの値が既知であるとして計算する手法でした。最初にそれらの値の取得について考えてみます。なお、下の図において黒塗りの四角がコア間通信です。
前回までに、マルチコアによる性能向上に関連して依存関係やオーバーヘッドの話をしました。では結局の所、性能はどのくらい上がるのでしょうか。特にマネジメントとしては大変気になるところです。しかし、聞いても誰も答えられず、やってみないとわかりません、といったマネジャーの機嫌が悪くなる回答しか得られないことがほとんどです。この問題について2回に分けて考えてみたいと思います。
今回は、まず一つのアプリケーションでの並列性能向上を概算する方法について説明し、次回、システムになったときに性能見積が困難になる要因について考えてみます。
下の図のようなソースコード構成を持つアプリケーションを考えます。ソースコードは図のようにAからEまでの部分に分かれ、Aから開始し、それぞれ最大一回ずつ実行されるとします。括弧内は実行時間です。依存関係については以下のようになっているとします。
・ データ依存関係:Aで生成されたデータをBとCが使い、BとCでそれぞれ生成されたデータをEで使う
・ 制御依存関係:Cの結果によりD-1またはD-2のどちらかが実行される
これらの依存関係をグラフとして表現すると下図右のようになります。実線はデータ依存関係、破線は制御依存関係で、矢印の始点側の処理が終わらないと終点側の処理を開始できない、という関係を表現しています。
マルチコアでは、スーパーリニアといって、コア数を超える性能向上が得られる場合があります。
スーパーリニアはリソースが増えたことにより起こります。例えば、シングルコアの時と比べて2コアではキャッシュが2倍になりますが、それが良い影響を及ぼすことがあります。
例として、大きな配列を扱う処理があり、配列全体は一つのプロセッサのキャッシュに載らないが、分割すれば二つのプロセッサのキャッシュに載るようなケースを想定します。また、キャッシュがヒットする場合はミスする場合と比較して処理が2倍高速になるとします。このとき、下の図のように、シングルコアではデータサイズが大きいため常にキャッシュミスすると仮定し、全体で100の処理量があるとします。2コア実行で、そのままキャッシュミスする場合、理想的には2倍の高速化ですが、データが各プロセッサのキャッシュにすべて載ったことにより、さらに2倍高速化し、全体で4倍の高速化になります。このような場合、前回までに説明したオーバーヘッドの影響があっても、コア数よりも高速化することがあります。
前回、コア数を増やしてもコア数ほどには性能があがらないという話をして、その理由の一つとしてオーバーヘッドの話をしました。
例えば、一つのプロセッサで計算量が100の処理を2つのプロセッサで実行させようとしたとき、相手のプロセッサに処理依頼をする、結果を受け取るといった処理がオーバーヘッドになります。その処理の計算量がそれぞれ20とすると、全体で処理量が140になってしまい、処理を理想的に2分割できたとしても各プロセッサの計算量は70になり、性能が2倍になることはありません(下図左)。もとの処理量が10倍の1000であれば、オーバーヘッドの計算量は変わらないため、状況はよくなります(下図右)
第5回 シングルコアからマルチコアへ
今回はシングルコアからマルチコアに移行した背景についてです。インタビュー動画第三弾では「シングルコアの限界」について、微細化の観点から易しく解説し、マルチコアに進んだ背景について紹介しています。
なお、すべての動画はEMCのYouTube動画ページからご覧いただけます。
第4回 マルチコアと電力の関係
今回はマルチコアと電力の関係です。マルチコアにするとシングルコアと比べて同じ性能を低電力で実現できます。ホモジニアス型についての原理についてはインタビュー動画第二弾「マルチコアと電力の関係」において易しく解説しているので紹介します。
ヘテロジニアス型については、ある機能、例えば画像処理、をCPU上でソフトウェアにより実現するよりも、処理に特化したハードウェア演算器を用いた方がはるかに低電力に実現できることが原理です。処理にもよりますが、同じ処理に対してソフトウェア実現よりもハードウェア実現の方が3桁程度低電力にできる場合もあります。
第3回 マルチコアの種類
マルチコアには様々な種類があります。学術的な分類はないのですが、2種類の分類軸がよく使われます。
はじめの軸はホモジニアス型とヘテロジニアス型です。ホモジニアス型は同一のプロセッサが並んでいるものです。多くの場合CPUです。ヘテロジニアス型は複数種類のプロセッサが搭載されている場合です。例えばCPUとGPUが搭載されているような場合です。
次の軸は対称型(SMP (Symmetric Multi-Processor)型)と非対称型(AMP (Asymmetric Multi-Processor)型)です。対称型はホモジニアス型に多く、SMP OSとよばれるOSが全体を管理していて、空いているプロセッサに実行可能なプロセスやタスクを動的に割り当てて実行させる方式です。これに対して非対称型は、各プロセッサを独立に動かし、基本的にプロセスやタスクは各プロセッサに静的に割り当てます。対称型はシステムスループットに勝り、非対称型はシステム分離性が良くなりリアルタイム性保証について考えやすくなることが特徴です。
なお、近年のプロセッサはコアの数も増えてきており、組込みマルチコアでは特に様々な種類のマルチコアが単一チップ上に混在している構成が増えてきています。
今回はマルチコアの必要性についてです。EMCでは、マルチコアに関する様々な話題について会長の枝廣先生と副会長の権藤さんにインタビューを実施し、トピックごとの動画としてお送りしています。今回はインタビュー動画第一弾である「マルチコアって必要なの?」(3分51秒)を紹介します。
省電力の観点を発端に、自動運転システムへの影響を例として、マルチコアの必要性について易しく語ります。
なお、すべての動画はEMCのYouTube動画ページからご覧いただけます。
第1回 マルチコア・メニーコアとは
マルチコアとはマルチコアプロセッサ(Multicore Processor)のことで、半導体チップ(LSI、SoC)の上に複数のプロセッサを搭載したものです。メニーコアプロセッサ(Manycore Processor)は「たくさんの」プロセッサを搭載したものですが、マルチとメニーの境界は分野の状況に応じて経験的に言われているものであり、学術的に決まっているわけではありません。
コアというのはIPコアのことですが、説明するためには半導体設計の歴史をさかのぼる必要があります。いまから50年程度前は、一つの機能部品、例えばプロセッサ、は複数の半導体チップから構成されていました。その後、半導体の微細化技術、集積化技術が進歩し、1980年代前半には単一の半導体チップに搭載できるようになり、「ワンチップマイコン」といった部品が生まれてきました。それから20年程度経ち、さらに半導体の技術が進歩し、単一の半導体チップに複数部品が搭載可能になったとき、半導体チップに搭載可能な一塊の
回路モジュールを部品製品とするビジネスが産まれてきました。ARMプロセッサはその典型例と言えるでしょう。そのような部品はIPコアと名付けられました。IP(Intellectual Property、知的財産)を有してライセンス可能とした塊、という意味でしょうか。このIPコアが、マルチコアのコアです。
そのため、IPコアはプロセッサだけでなく、例えばUSB回路モジュールなどもIPコアになります。そういうことを考えると、マルチ・プロセッサコアと呼ばれてもよいように思いますし、チップマルチプロセッサ、あるいはその前にワンやオンを付けて呼ぶ人などもおりましたが、今ではマルチコアプロセッサという名前に落ち着いています。また、プロセッサはCPUだけではなく、Graphics ProcessorやAI Processorなどもマルチコアのコアになります。
組込みマルチコアは言葉通り組込み向けのマルチコアです。組込みでない(汎用コンピュータ向けの)マルチコアはほとんどのコアがCPUであることが多いですが、組込み向けは下図のように機器の多様な機能に特化したコアを多種類搭載している場合が多くなっています。そのため、その上で実行されるソフトウェアも単純な並列化だけではなく極めて複雑なものとなり、使いこなすためにはシステム要求からマルチコア仕様を考慮して様々なツールを使いこなして設計していく
必要があり、極めて高度な設計技術が要求されています。
●マルチコア適用ガイドのリニュアル版公開
●EMCブログ「はじめての並列化」も好評連載中
一般社団法人 組込みマルチコアコンソーシアム
〒104-0042 東京都中央区入船1丁目5-11 弘報ビル5階