元麻布春男の週刊PCホットライン

メニーコア時代の新しい並列化プログラミング手法とツール



 10月14日と15日の2日間にわたって、インテルは都内で「インテル ソフトウェア・カンファレンス2010」を開催した。

 「ROCK YOUR CODE」という副題のついたこのイベントは、インテル製プロセッサに最適化されたアプリケーションを記述するために必要となる手法と開発ツールを紹介するものである。特に、現在進行中であるプロセッサのマルチコア化、メニーコア化を踏まえ、現在のみならず、将来のプロセッサにおいても陳腐化しないコードの作成手法に関するセミナーとなっている。その中心となるのは、自社のC/C++コンパイラーをはじめとする開発ツールだが、他社製のツールも含まれる。

基調講演を行なったIntelのチーフエバンジェリスト兼ディレクターであるジェームズ・レインダース氏

 初日の基調講演に登壇したのは、米Intel本社のソフトウェア開発製品部門でチーフエバンジェリスト兼ディレクターの肩書きを持つジェームズ・レインダース氏。氏は、これからのプログラミングは、すべて並列化プログラミングにならなければならないとした上で、新しい並列化プログラミングの手法/ツールとして、「Intel Cilk Plus」を紹介した。

 現在主流となっている並列化プログラミングモデルは、スレッド管理(スレッドの生成やロック)やデータの並列化(CUDA、OpenCL)など、非常にローレベルな実装にとどまっている。プログラマーは、アプリケーションの機能を実現したいにもかかわらず、本来の目的ではなく、手段であるスレッドの管理に多くの作業時間を割かざるを得ない。

 もちろん、こうしたローレベルのプログラミングモデルは、極限の性能を追求するスーパーコンピューター/HPC/科学技術計算分野では避けられないことだが、一般のアプリケーションを記述するには適さない。あまりにもローレベルすぎて、コードの信頼性やスケーラビリティを確保するのが困難であるからだ。レインダース氏は、こうした手法はスーパーコンピュータへの応用を中心に、今後も重要であり、何百個ものプロセッサを実装した並列コンピュータ環境においてほかに選択肢はないと断った上で、マルチコア時代の主流とはならないと述べた。


現在の並列プログラミングが抱える問題点「Intel Cilk Plus」の概要Intel Cilk Plusの中心となるのは、フローを制御する3つのキーワード(写真にあるのは2つ)

 主流となるべき並列化手法は、コードの信頼性やスケーラビリティの確保が容易でなければならない。そのために暗黙的な並列化は開発ツールが自動的に処理すべきであり、プログラマーが行なう明示的な並列化も、スレッド、つまりはハードウェアにマッピング可能な実行コンテキスト(命令ポインター、レジスター値、スタック等)を持つ実行の主体を直接扱わないようにする必要がある。プログラマーが直接スレッドを扱ってしまうと、その時点で実行環境(実行されるプロセッサのコア数等)を想定したスレッドの管理を行なわなければならなくなる。そうではなく、スレッディング等はランタイム時に決定されることで、実行環境に依存しない並列化プログラミングが可能となる。

 スレッドに代わる概念として、並列化の処理単位として用いるのがタスクである。タスクは並列処理可能なひとかたまりの処理であり、実行時にランタイムによってスレッドへと分割される。このタスク並列という考え方は、レインダース氏のみならず、次に登壇したマイクロソフトのデベロッパー&プラットフォーム統括本部のエバンジェリストである岩田雅樹氏も述べていた。岩田氏は、.NET Framework 4.0における並列プログラミングの手法として、データ並列とタスク並列を取り上げている。

 さて、主流となりうる並列化処理の手法としてレインダース氏が紹介したのがIntel Cilk Plusである。Cilkは、1994年にMITのコンピュータサイエンスラボで開発された、並列処理を行なうためのC言語の拡張で、既存のCソースコードに簡単なキーワードを追加するだけで、並列処理を実現するものであった。また、逆にCilkのキーワードを取り除くことで、標準C言語のソースコードに簡単に戻すことができる。この商用化ならびにC++への拡張を行なっていたCilk ArtsをIntelは2009年9月に買収しており、Intel Cilk PlusはCilk Artsの技術をベースにしたものとして、Intel C++ Composer 2011で正式リリースされる。

.NET Framework 4.0による並列プログラミングを紹介したマイクロソフトの岩田雅樹氏従来からあるデータ並列に加えて、タスク並列の考え方を紹介(岩田氏のプレゼンテーションより)

 Intel Cilk Plusの中心となるのは、3つのキーワードだ。並列実行するループ反復を指定するcilk_for、並列処理可能なタスクをスポーンするcilk_spawnと、その結果を同期するcilk_cync、ただこの3つのキーワードを適宜用いるだけで、既存のシーケンシャルなCソースコードを並列化することができる。写真の例では、xとyそれぞれについてスポーン(cilk_spawn)し、その結果を同期(cilk_sync)しているが、このキーワードを取り除くだけで、元のCソースコードに戻せることが分かる。

 x86プロセッサの世界にデュアルコアプロセッサが登場したのは2005年のことだ。それから5年、OS上で複数のアプリケーションが実行される環境が普及したこともあり、プロセッサのマルチコア化は市場で受け入れられているが、アプリケーションのマルチコア対応はそれほど進んでいない。これでは、市場が欲するプロセッサコア数が、頭打ちとなるのも遠いことではないだろう。

 これまでのアプリケーション並列化処理は、プログラマーの負担が大きい割には、完成したアプリケーションにおける効果が乏しかった。世の中の多数のアプリケーションは、データ並列処理とは全く無縁だ。Cilkのような簡便な並列化であれば、プログラマーの負担は最小限であり、かつ将来のメニーコア環境においても性能面でのスケーラビリティが担保され得る。

 このような簡便な並列化手法が普及することで、アプリケーションのマルチコア対応が進み、Intelのメニーコア戦略とソフトウェアが齟齬を起こさないようにしたい。今回のソフトウェア・カンファレンスからは、そのような意図が感じられたが、それはBulldozerでメニーコア化を行なうAMDにとっても望ましいシナリオであるハズだ。