この記事は、インテル® ソフトウェア・ネットワークに掲載されている「How to sound like a Parallel Programming Expert Part 2: Parallel hardware」(http://software.intel.com/en-us/articles/how-to-sound-like-a-parallel-programming-expert-part-2-parallel-hardware/) の日本語参考訳です。
並列プログラミングのエキスパートのようになるには
並列コンピューティングは古くからあるもので、最も古い並列コンピューターは 1950 年代後半まで遡ります (A.L Leiner ほか『Proc. EJCC』1958 年、71-75 ページ)。60 年代から 70 年代を通して、最上位のコンピューターは、複数のプロセシング要素 (プロセッサー) と並列ソフトウェアを活用することでスピードアップを達成しました。しかし、これはごく一部の (潤沢な資金を得た) アプリケーション用の特別なマシンでのみ行われました。
その後、1980 年代半ばに、Caltech Concurrent Computation Project により、新たな並列コンピューティングの時代が始まりました。Charles Seitz 教授と Geoffrey Fox 教授の指揮の下、ハイパーキューブ (超立方体) と呼ばれる高次元に一般化した立方体の頂点に、64 個のインテル® 8086/8087 プロセッサーを配置した科学アプリケーション用のスーパーコンピューターが構築されました。これにより、多くの市販 (COTS) マイクロプロセッサーが、高価なカスタム・ベクトル・マシンによって独占されていたスーパーコンピューター市場に進出したため、これは後に「キラーマイクロの攻撃」として知られるようになりました。
その後、超並列プロセッサー (MPP) はハイパフォーマンス・コンピューティング分野の大半を占めるようになり、1997 年にインテルの ASCI Red コンピューターがベンチマーク (MPLinpack) で史上初の 1 TFLOP (1 秒間の倍精度加算/乗算の実行が 1 兆回) を超えたことで、これは最高潮に達しました。その後 MPP はサイズ、性能ともに進化を続け、現在最高レベルのコンピューターでは PFLOP (1 秒間に 1,000 兆回の浮動小数点演算を実行) を達成しています。
MPP コンピューターは市販のマイクロプロセッサーを搭載していたものの、カスタム・ネットワークと超高密度のパッケージを採用していました。80 年代後半になると、クラスターと呼ばれる新しい種類の並列スーパーコンピューティングが出現しました。
クラスターとは、多数の市販コンピューターを既成ネットワークで連結した並列コンピューターです。80 年代後半に Unix* ワークステーションから始まり、90 年代半ばには PC の浮動小数点のパフォーマンスが Unix* ワークステーションと同レベルになり、Linux* を実行する PC ベースのクラスターが主流になりました。今日、クラスターは科学技術計算に大きく貢献し、情報化時代を支えるデータセンターのアーキテクチャーとして優位を誇っています。
MPP コンピューター (そしてクラスター) の欠点は、ソフトウェアにあります。ソフトウェアを並列に実行する重荷をプログラマーだけが強いられることになったのです。MPP マシンは、個別のメモリーを持った数千ものプロセッサーを搭載していることがあり (いわゆる分散メモリー型 MPP と呼ばれるもの)、数千あるいは数百万ものローカルデータを処理する個々のタスクに処理を明示的に分割し、タスク間のすべての共有を明示的なメッセージを利用して行う必要があります。スケジューリング、通信、データ分解などのすべての作業をプログラマーが手動で対応しなければなりません。
並列コンピューティングを推進した別の要因は、共有メモリー型マルチプロセッサー・コンピューターです。これは、スーパーコンピューティング・アプリケーションでは 70 年代後半に、ビジネス・コンピューティングでは 80 年代後半に出現しました。そして、90 年代の半ばには、インテルがチップセットと一体化した 1 つのボードに複数の CPU を配置したことで、マルチプロセッサー・コンピューティングがメインストリームに拡大しました。これらのマシンが登場したことで、いろいろな意味でプログラムが容易になったのです。
プログラマーはコンパイラーの力を借りてソフトウェアの並行化の可能性を探り、1 つのアプリケーションで複数のスレッドを使用して並行処理を表現できるようになりました。スレッドはメモリーを共有するため、アプリケーションでデータを分解する必要はありません。また、スケジューリングはオペレーティング・システムにより処理されます。
このように、従来と比べると、はるかに作業しやすくなりました。さらに、オペレーティング・システムがマルチスレッド化されているため、コンピューターはマルチタスク(複数のシングルスレッド・アプリケーションの同時実行) や並列ハードウェアの恩恵をただで受けられるようになったのです。
現代の並列コンピューティング
これまでの並列スーパーコンピューティングの歴史において、シングル・プロセッサーのパフォーマンスはムーアの法則i により一定に上昇してきました。そのため、ほとんどのプログラマーは、並列プログラミングと向き合う必要がありませんでした。しかし、新世紀の幕開けとともに、これは変化してきています。
現在もムーアの法則によりパフォーマンスは向上していて、これは将来も続くでしょう。しかし、同じ消費電力でシングルチップに複数のコアを搭載するには、ムーアの法則のすべてのトランジスターを使用しなければなりません。並列コンピューティングは、以前はスーパーコンピューティングでのみ採用されていましたが、今日ではあらゆるコンピューティング分野で重要なテクノロジーといえるでしょう。
コア数 (チップ上のプロセシング・ユニット) も増加し続け、現在は 4 コアや 8 コアが主流ですが、これから 10 年の間には数百コアになることも十分考えられます。ありえない話だと思いますか?
2007 年にインテルは、ベンチマークで 1 TFLOP を超える 80 コアのマイクロプロセッサーのデモを行いました。このときは単精度の TFLOP と比較的単純なベンチマーク (MPLINPACK ベンチマーク全体ではなく、ステンシル計算のみ) が使用されましたが、この 10 年間でインテルは、以前は消費電力がメガワットの 9000 を超える CPU を搭載したコンピューターで行っていた TFLOP レベルの計算を、消費電力 100 ワットの 80 コアを搭載したシングル CPU で実現したのです。これは、すごいことです!!!
メニーコアの将来は明るく、並列コンピューティングという強固な基盤により、この流れは今後数十年にわたって続くと考えられます。ハードウェア面で取り組まなければならない多くの課題がありますが、その対処方法はすでにだいたい判明しています。
ユーザーがメニーコアチップの力を利用できるかどうかは、ソフトウェアにかかっています。ソフトウェアの進化には、数十年とまではいかなくても、数年かかります。ソフトウェア基盤をメニーコア対応に移行するのは非常に困難で、正直なところ、どうしたらこの作業を先送りできるかは分かっていません。
一部の重要なアプリケーションはメッセージパッシング手法を使用してスケーリングできますが、これは汎用プログラマーにとって容易なことではありません。ソフトウェアについては、このシリーズのパート 4 で詳しく取り上げます。ここでは、ハードウェアについて見ていきましょう。
定義
並列プログラミングのエキスパートのようになるためには、並列ハードウェアに関するいくつかの専門用語を理解する必要があります。知らなければならない用語はそんなに多くありません。
まず最初に、並列ハードウェアは命令ストリームやデータストリームと考えることができます。この 2 種類のストリームの関係を理解することは、並列ハードウェアについて考える上で重要です。さまざまなケースがありますが、並列システムで重要なのは次の 2 つです。
- 複数のデータまたは SIMD ストリームの操作を行う 1 つの命令ストリーム
- 複数のデータまたは MIMD ストリームの操作を行う複数の命令ストリーム
SIMD コンピューターでは、データに並列性があります。1 つのプログラムカウンターが、複数のデータ要素の操作を行う命令ストリームで使用されます。最近のマイクロプロセッサーにあるベクトルユニットは SIMD コンピューターです。
MIMD コンピューターでは、プロセシング要素ごとに個別のプログラムカウンターがあり、それぞれの命令ストリームを実行します。ほとんどの MPP コンピューターとクラスターは MIMD コンピューターです。
並列コンピューターは、最初にデータストリームと命令ストリームで、次にメモリー階層で分類できます。マルチプロセッサー・コンピューターでは、すべてのプロセッサーが同じアドレス空間を共有します (そのため、共有メモリー型マルチプロセッサー・コンピューターと呼ばれることもあります)。共有メモリー型マルチプロセッサー・コンピューターは、大きく 2 つに分けられます。
- 対称型マルチプロセッサー/SMP コンピューター: メモリーアドレスのアクセスにかかるコストはすべてのプロセッサーで同じです。さらに、オペレーティング・システムにはすべてのプロセッサーが同等に見えます。
- NUMA (Non-uniform Memory Architecture)/NUMA コンピューター: メモリーアドレスのアクセスにかかるコストはプロセッサーによって異なります。
キャッシュの動作を考えると、ほとんどすべてのマイクロプロセッサー・コンピューターが NUMA マシンであるといえます。ただし、複数のプロセッサーに対してメモリー・サブシステムが 1 つのアーキテクチャーには、通常 SMP という用語が使用されます。
並列コンピューターのメモリー・アーキテクチャーには、このほかにもプロセシング要素ごとにローカルアドレス空間を持たせた 分散メモリー・アーキテクチャーがあります。ほとんどの MPP スーパーコンピューターとほぼすべてのクラスターは、分散メモリーシステムです。
複数のコアを搭載したシングルチップ
これらの基本的な定義を理解したところで、マルチコア・プロセッサーについてより詳細な話に入りましょう。個々のコアは個別のプロセシング要素で、基本的には以前のシングルコア PC の CPU と同じと考えることができます。ほとんどの場合、コアにはベクトルユニット (SIMD 並列コンピューティング・ユニット) が含まれています。
1 つのダイにマルチコアを搭載し、一貫したシングルアドレス空間に結合することで、SMP MIMD 並列コンピューターとなります。このようなチップをマルチコアチップと呼びます。SMP システムではコア数が多くなるため (適度な数である 16 を超えるため)、シングルアドレス空間のスケーリングは困難です。「任意の多い」コア数にスケーリングできる方法でコアが結合されている場合、そのようなチップをメニーコアチップと呼びます。例えば、前述の 80 コアのテラスケール・チップがそうです。このチップでは、分散メモリー型 MIMD アーキテクチャーを採用しています。
共有メモリー型 MIMD アーキテクチャーのメニーコアチップは可能でしょうか?メモリー・アーキテクチャーがスケーラブルで、コアを結合するネットワークが大きなコア数にスケールアップできるように設計されていれば可能です。SMP MIMD メニーコアチップの良い例として、インテルの Larrabee (開発名) チップがあります。
メニーコアチップを設計する過程で、並列チップの設計者は数え切れないほど多くのことを、詳細に対処していかなければなりません。それらすべてに関する専門用語を理解し、覚えることは無理でしょう。しかし、ここで紹介した基本的な用語である SMP、MIMD、SIMD、メニーコア、マルチコアを覚えておけば、話は理解でき、エキスパートのような印象を与えることができるでしょう。
次のステップ
ここまでは、並行性と並列性の基本的な概念、そして並列ハードウェアの基本について説明しました。パート 3 では、並列コンピューターでプログラムを実行した場合の一般的な問題を見てみましょう。
著者紹介
Tim Mattson はインテル コーポレーションのマイクロプロセッサー・テクノロジー研究部門の主任エンジニアで並列プログラマー。20 年以上にわたり、並列コンピューターを使用して、化学反応、タンパク質分解、石油発見、遺伝子解読など、多数の科学的問題に取り組む。将来の目標は、シーケンシャル・ソフトウェアを希少なものにすること。この目標達成に向けて日々努力している。 |
i http://www.intel.com/technology/mooreslaw/
インテル® ソフトウェア製品のパフォーマンス/最適化製品に関する詳細は、最適化に関する注意事項 (英語) を参照してください。