自動並列化でマルチコアの性能を引き出す並列処理に強い開発ツール |
最近アプリケーション開発において「並列化」が注目を浴びつつある。マルチコアCPUを搭載するPCが増えており、そのような環境では並列化によって大幅なパフォーマンス向上が期待できるからだ。しかし、アプリケーションの並列化は容易ではない。そのような状況の中、並列化をサポートする機能を備えた開発環境が登場している。その1つが、強力な並列化機能を備える「インテル コンパイラー」である。
マルチコアCPU普及でニーズが急上昇 |
かつては大規模コンピュータでしか見られなかったマルチコアCPUが、ここ数年で一般的なサーバ・PCのレベルにまで急速に普及しつつある。例えばインテルのCPUを見てみると、2006年発売のCoreシリーズを皮切りに、現在ではエントリーモデルを含むほぼすべてがマルチコアCPUとなっている。OSのマルチコアサポートも強化され、例えばWindows 7ではマルチコアCPUのパフォーマンスを引き出せるよう最適化されている。
一方で、マルチコアCPUをサポートするアプリケーションはまだ一部に限られる。その理由の1つに、マルチコア対応アプリケーション開発の困難さが挙げられる。アプリケーションをマルチコアに対応させるには、処理をCPUの各コアが分担して実行できるように分割しなければならない。これは「並列化」と呼ばれるが、これにはデータの適切な分割や重複処理の防止、データの同期など、考慮すべきポイントが多くある。また、場合によっては処理アルゴリズム自体を修正、再構築する必要もある。
デバッグやパフォーマンスチューニングの難しさもハードルの1つだ。並列化されたプログラムの場合、おのおのの処理の実行タイミングが予測しづらいため、「正しく動作しているように見えるが、たまに問題が発生する」という、いやらしいバグが発生しやすい。「並列化すべきでない個所を並列化してしまいパフォーマンスが悪化した」という話もよく聞かれる。
このように並列化には困難な課題も多いが、一方で恩恵も大きい。例えばデュアルコア環境の場合、単純に考えると2倍の処理を同時実行できることになる。オーバーヘッドのため実行時間がそのまま半分になるわけではないが、多くの数値計算を実行するようなアプリケーションでは実行時間が3〜4割程度短縮できた、という例も聞かれる。実行速度が求められるアプリケーションにおいては、マルチコア対応は必須と言っても良いだろう。
さて、このように並列化が求められている現状を受け、近年では並列化機能を重視した開発環境が登場している。その1つがインテルのソフトウェア開発製品である「インテル コンパイラー」 だ。
インテル コンパイラーはC/C++およびFortranに対応したコンパイラ製品で、WindowsおよびLinux、Mac OS X版がリリースされている。強力な最適化機能や並列化サポート機能が特徴で、パフォーマンスが求められる分野で多くの実績と評価が得られている製品だ。例えばデータベースシステムメーカーであるオラクルは、データベース製品の開発にインテル コンパイラーを採用して最適化を行っている。
コードの修正なしに並列化が可能 |
インテル コンパイラーでは、並列化をサポートする3つの機能を搭載している。1つはプログラム中のループ個所を自動的に並列化する機能で、「自動ベクトル化」と呼ばれている。
自動ベクトル化はCPUの「ストリーミングSIMD拡張命令(SSE)」という機能を用いて複数の演算を一括処理するものだ。例えば単精度浮動少数点数型の演算を行うループの場合、4つの演算を一度に処理できるようになる。この自動ベクトル化は、コアが1つしか利用できない環境でも効果を発揮する。
もう1つの並列化サポートは「自動並列化」と呼ばれるもので、繰り返し実行される処理を自動的に複数のCPUコアに割り当てて並列実行させるものだ。自動並列化は、マルチコア環境において大幅なパフォーマンス向上が期待できる。
自動ベクトル化や自動並列化はソースコードのコンパイル時に適用される。これにより、開発者はソースコードを一切変更することなしにプログラムを並列化できる。ただし、必ずしもすべてのループを並列化できるわけではない。インテル コンパイラーが優れている点として、並列化できない個所に対して診断メッセージを表示する点がある。「データ構造が並列化に適していない」「ループ内の処理がほかの個所に依存している」など、具体的な形で問題点が指摘され、チューニングのヒントとして利用できる(画面1)。
画面1 「自動並列化」や「自動ベクトル化」できない個所については、コンパイル時の診断メッセージでその理由が確認できる(クリックすると拡大します)。 |
3つ目の機能は、クロスプラットフォームの並列化API「OpenMP」のサポートである。OpenMPはFortranおよびC/C++向けの標準化されたAPIで、最小限のコード修正でプログラムを並列化できるのが特徴だ。インテル コンパイラーは2008年5月にリリースされた最新版であるOpenMP 3.0をサポートしており、さまざまな並列化機能をフルに活用できる。
このように強力な機能を備えるインテル コンパイラーだが、Windows版はVisual C++、Linux/Mac OS X版はGCCとの互換性を備えている点も特筆すべき特徴だろう。Windows版インテル コンパイラーはVisual Studio向け統合機能も備えており、Visual StudioのIDEからボタンのクリック1つでコンパイル設定を行ったり、GUIによるコンパイルオプション設定が可能だ。そのため、Visual C++やGCCで開発していたプログラムでも、簡単にインテル コンパイラーでコンパイルでき、すぐに自動ベクトル化/自動並列化の恩恵に預かれるのである。
また、並列処理に対応したデバッガが同梱されるのもポイントだ。異なるスレッドからの同一データへのアクセス競合を検出できたり、OpenMPで並列化されたループを非並列で実行する「シリアル実行」機能を備えるなど、並列化に役立つ機能が備えられている。Windows版には、こうした機能をVisual StudioのIDEに統合できる「インテル Parallel Debugger Extension」も付属し、使い慣れた開発環境が利用できる点も見逃せない。
自動並列化によって約14倍の高速化も |
インテル コンパイラーの並列化機能が真価を発揮するのは、単一の処理を何回も繰り返すようなプログラムだ。例えば2048×2048サイズの行列の積を求めるプログラムの場合、Visual Studio 2008でコンパイルした場合と比較して自動並列化を使わない場合で約4倍、さらに自動並列化を利用して4コアをフルに使用した場合で14倍以上の性能向上が見られるという(グラフ)。このような特徴から、インテル コンパイラーは映像分野や金融分野において特に導入が進んでおり、またパフォーマンスチューニングのための支援ツールとしても使われているとのことだ。
4コア搭載のCore i7プロセッサを搭載するマシンでのパフォーマンス比較結果。インテル コンパイラーを使用することで、大幅な高速化が達成できている(クリックすると拡大します)。 |
多くのPCがマルチコア化している現在、アプリケーションの並列化というのは、今後ますます重要な課題となってくることが予想される。現在はデュアルコアCPUが大半だが、より並列化の効果が高いトリプルコア、クアッドコアといったCPUも普及しつつある。容易に利用できる自動並列化機能と、きめ細かいパフォーマンスチューニングやアルゴリズム実装が可能なOpenMPの2つを兼ね備えるインテル コンパイラーは、プログラムの並列化を支援する強力なツールとなるはずだ。機能制限なしに30日間利用できる評価版も用意されているので、並列化に興味のある方や、アプリケーションのパフォーマンスに頭を悩まされている方などは、ぜひ試してみてはいかがだろうか。
ダウンロード
提供:エクセルソフト株式会社
アイティメディア 営業企画
制作:@IT 編集部
掲載内容有効期限:2010年07月15日
「並列処理対応の強い味方」 INDEX |
|
【PART 1】 自動並列化でマルチコアの性能を引き出す 並列処理に強い開発ツール 「インテル コンパイラー」 |
|
【PART 2】 並列化に特化した開発ツールセット「インテル Parallel Studio」 |
ダウンロード
関連リンク
関連資料
マルチスレッド・アプリケーション開発のためのインテル・ガイド
並列化について学べる小冊子「THE PARALLEL UNIVERSE」
関連記事
インテル C++/Fortranコンパイラ9.0、マルチコア対応強化 (@IT News)
ItaniumRプロセッサーの性能を最大限に引き出すアプリケーションの最適化とは (@IT Special PR)