アットマーク・アイティ @IT@IT情報マネジメント@IT自分戦略研究所QA@ITイベントカレンダー  
 
 @IT > Itanium®プロセッサーの性能を最大限に引き出すアプリケーションの最適化とは
 
@IT Special

 

PR

Itanium®プロセッサーの性能を
最大限に引き出すアプリケーションの最適化とは

 前回の記事で触れたように、Itanium® 2プロセッサー・ファミリーは基幹システムの実行に適した並列処理性能を備えている。デュアルコアからマルチコア、メニーコアへの今後の進化は、さらに並列処理の可能性を広げていくことになる。

 ではその性能を最大限に生かすようにプログラムを最適化するには、どうすればよいのだろうか。基本的にはItanium® 2プロセッサー・ファミリーが採用しているEPICアーキテクチャのために必要とされるコンパイラーでの並列化作業、そしてItanium® 2プロセッサー・ファミリーに限らずマルチプロセッサーやマルチコア構成に全般的に当てはまるマルチスレッド化の作業がある。しかしどちらについても、現在では豊富な支援ツールが利用できるため、面倒なものではなくなっている。

    EPICアーキテクチャにコンパイラーは不可欠

 コンピュータの処理性能を向上させるためには、3つの要素がある。1つ目がプロセッサーそのものの高速化だ。クロック周波数を上げることでプロセッサーの高性能化を追求してきたことが、その代表的なものだ。もう1つが、プロセッサーの中でいかに並列に命令を実行できるようにするかということ。これは、プロセッサーが高度な並列処理に対応するのはもちろん、実行するプログラム側でその並列処理機能をいかに有効に活用できるかが鍵となる。特にEPICアーキテクチャを採用するItanium® 2プロセッサー・ファミリーでは、コンパイラーが担うべき部分が大きい。

 インテルコンパイラーの現在の最新版は、2006年5月から出荷を開始(日本語版は8月)したVer9.1だ。このバージョンからデュアルコア化されたIntel Itanium® 2プロセッサー9100番台をサポートしている。そのため、9100番台に最適化するオプションスイッチを指定してコンパイルすれば、プロセッサー内でなるべくたくさんの命令が実行できるよう、同時実行する命令を組み合わせたり命令実行の順番を設定したりといったことを、コンパイラーが自動的に処理し最適化してくれる。

インテルによるC++/Fortranコンパイラーの機能比較。Itanium® 2プロセッサー・ファミリーはインテル以外のコンパイラーにおいても広くサポートされるに至っている(クリックすると拡大します)

 従来のPentium4やXeonプロセッサーの場合、ハード側で同時に実行できるものを見つけ並列に実行するという仕組みだった。しかしEPICに基づくItanium® 2では、何も手を施さなければプロセッサーの中身を使い切ることができない。その部分を補完しすべてのリソースの有効活用を促すのが、コンパイラーの役目なのだ。

 Itanium® 2プロセッサーを活用するためには、インテルVTuneパフォーマンス・アナライザーの利用も役立つ。Itanium® 2に特化したパフォーマンスチェックが可能で、特定の関数、モジュール、命令レベルまで分析し、ボトルネックを正確に把握できるツールだ。また、コード改良のアドバイスを自動的に提示することでも、開発者の作業効率を向上するという。

 コンパイラーもVTuneパフォーマンス・アナライザーを単独で使用できるのはもちろん、既存の使い慣れた開発環境と融合することも可能だ。例えば、Windows版製品ではマイクロソフトのVisual Studio .NET/Visual Studio 2005と統合でき、これらのツールを既存の開発環境内から直接呼び出し利用できる。また、Linux版のインテルC++コンパイラーは、定評あるEclipseにプラグインすることも可能だ。さらに、Microsoft Visual C++やGnu Cコンパイラー、その他Fortranコンパイラーなどとの間で、ソース互換、あるいはバイナリ互換性も確保しているので、既存の開発環境を乗り換えることなく、インテルのツール群の優位性を利用できる。

    さらなる高性能を発揮させるマルチスレッド化

 処理性能向上のための3つ目の要素が、スレッドレベルでの並列化だ。これはItanium® 2プロセッサー・ファミリーに限ったことではないが、マルチプロセッサー構成、そしてプロセッサーのマルチコア化をより効率的に活用するには、マルチスレッドに対応したプログラムを実行する必要があるのだ。前述の処理性能向上の2つの要素は、開発者がその活用をそれほど意識せずとも効用を得られる。2つ目の要素である命令の並列化効果を得るには、適切なコンパイラーを選択し、該当するプロセッサー用の最適化オプションスイッチを設定するだけでいい。あとは、コンパイラーが最適化された実行モジュールを自動的に作り出す。

 しかしながら、3つ目のスレッドレベルでの並列化の実現のためには、開発者にマルチスレッド対応のアプリケーションプログラムを書いてもらわなければならない。

 「現状では、デベロッパーにマルチスレッドアプリを書いてくれと言っても、なかなか書いてはもらえない。これをツールで強力にサポートするというのが、ここ最近のインテルのアプローチとなっている」と語るのは、ソフトウェア&ソリューションズ統括部 ソフトウェア製品部 プロダクト・マネージャーの菅原清文氏。

 つまり、ハードウェアが新しくなったときに、開発者がそのことを意識するのではなく、コンパイラーやライブラリなどの開発ツールに任せてしまう。そして、開発者は、アプリケーションのロジック部分の開発に注力できるようにするということだ。パフォーマンスを向上させようとすると、どうしてもプログラムの正当性との間にトレードオフが発生する。自動化で補えない部分は、開発者の手によってプロセッサーに特化したコードを入れ込まなければならず、コードをマルチスレッド化する際には、新たなマルチスレッド特有のバグを内包させる危険性も孕んでしまう。

 「マルチスレッドのプログラムでは、同じデータセットを共有し処理が行える。そのため何らかの不都合が起こるとデータの読み書き処理で競合が発生し、デッドロックが状態となってしまう。こういった不具合が毎回同じところで、かつ同じ条件で出るとは限らないのでバグとしては発見しにくい。マルチスレッド化を支援するツール群を利用すれば、こういったバグの発生を減らすことが可能だ」(菅原氏)

 具体的にツール群を活用しプログラムのマルチスレッド化を進めるには、大きく2つの方法がある。1つは前述のコンパイラー機能を利用するもの。もう1つがスレッド化を支援するライブラリなどを活用するものだ。

 コンパイラー機能によるマルチスレッド化では、前述のコンパイラーのプロセッサーに対する最適化オプションスイッチの設定でも、コンパイラーは自動的にソースコードを解析し構造に適したマルチスレッド実行可能な実行モジュールを作成する。また、プラットフォームに依存しない並列プログラミング用APIであるOpenMPの導入により、並列化を指示する構文をプログラム中に記述することで、マルチスレッド並列プログラムを明示的にも開発できる。これらの方法では、プロセッサーが変わったりプラットフォームが変更される場合には、適宜コードを変更しリコンパイルすることで新しい環境にも対応可能だ。

    ライブラリの活用でマルチスレッド化を促進する

 ライブラリを用いてマルチスレッド化を支援する方法では、さらに柔軟でポータビリティ性の高いアプリケーションプログラムの構築を可能にする。インテル マス・カーネル・ライブラリは、ライブラリ自体がスレッドセーフな関数群で構成されているので、開発者がマルチスレッド化されたコーディングをせずとも、このライブラリを使うだけで該当部分はマルチスレッド化することになる。このライブラリは、IA32、IA64アーキテクチャで同じインターフェイスなので、IA32用のプログラムであってもライブラリの利用部分についてコード変更なしで、最新のItanium® 2に最適化されたマルチスレッド化が自動的に実現できる。さらに、このライブラリには、マルチスレッド化とともにプロセッサーがもつキャッシュのヒット率を効率化する機能もある。

 また、主にマルチメディア関連処理のためのライブラリとして、インテル インテグレーテッド・パフォーマンス・プリミティブがある。エンタープライズ向け用途ではあまりマルチメディア機能は利用しないかもしれないが、文字列計算やデータ圧縮/暗号化などの関数もそろっている。当然このライブラリも、マルチコアに対応したスレッド化された関数群なので、利用するだけでプログラムはマルチスレッド化することになる。

 もう1つのライブラリが、インテル スレッディング・ビルディング・ブロック(TBB)だ。これは、2006年8月に出荷開始した新しいC++用のマルチスレッド化のためのランタイムライブラリだ。実はコードをマルチスレッド化しても、コアの増加に合わせ効率的に性能を向上させるのは難しい。コアが2個の上では効率よく動くスレッドプログラムも、4個、8個、16個と増やしていったときに、等比級数的にスケールして性能が向上するとは限らないのだ。コア数より多いスレッドあるいは少ないスレッドとなる、オーバー/アンダー サブスクリプションの状態では十分に性能を発揮できず、これをなくし常に最適な状態を維持するためには、スレッドコントロール部分を別にしてコードに組み込む必要がある。インテルTBBは、スレッドコントロールを別のランタイムライブラリとしてもっているため、パラメータでスレッドサイズやコア数をプログラムの外から指定でき、コア数が変わってもコード変更なしに対応できる。

インテル スレッド・ビルディング・ブロック(TBB)が提供するランタイムライブラリ

 もちろんライブラリを使わずに、OSのAPIを用いて独自にコードをマルチスレッド化する方法もある。この場合は、スレッドのスケジューリングはOS任せになる。つまり、OSのカーネルオブジェクトでスレッドは処理される。OSカーネルは、すべてのプロセスを同等に扱う。そのため、作成したプログラムのスレッドも他のアプリケーションのスレッドと一緒にスケジューリングされ、特定のプログラムの処理を優先させることはできない。インテルTBBは、スレッドのスケジューリングを自分自身で制御できる。このスケジューラには深度優先実行タスクという機能があり、これはタスクの下に処理すべきタスクをより多く抱えているタスクを優先して処理するというものだ。つまり、優先すべきタスクを確実に決められるので、スレッドのスケジューリングでのボトルネックを解消できるのだ。

 「インテルのツール群を使うことで、ブロックサイズがある程度大きくなれば、マルチスレッド化によりスレッドが2つで2倍、4つで4倍といったように性能が確実にスケールするようになる」(菅原氏)

 このように、インテルが提供するツール群を活用すれば、マルチコア化する新しいプロセッサー性能を引き出すために、開発者が意識すべきことはそれほど多くはない。とはいえ、インテルからは多数のツールが提供されており、どのような場合にどれを使えばいいのか、さらに十分にそれらを活用するにはどうすればいいのかといったことについては、あらかじめ押さえておく必要があるだろう。ドキュメントを読み込んで独学でマスターするのでも構わないが、インテルではツールの使い方、効率的な開発方法について「インテル ソフトウェア・カレッジ」という定期的な教育コースを用意している。これを利用するのも、性能の高いプログラムを構築する早道となるだろう。


提供:Itanium® Solutions Alliance
企画:アイティメディア 営業局
制作:@IT 編集部
掲載内容有効期限:2007年1月31日
 
関連リンク
創立メンバー(日本地域委員会)
富士通
日立製作所
日本ヒューレット・パッカード
インテル
NEC
日本SGI
日本ユニシス

Developer Days Japanレポート
[第1回] Itanium® Solutions Alliance主催 日本初の開発者向けテクニカルセミナー開催! 並列化でLinuxソリューションの魅力を高める方法を伝授
[第2回] Windowsベースの基幹システム構築が加速化 Itanium® Solutions Allianceが Windows開発者向けセミナー開催で後押し

@ITの関連記事
ItaniumとWindowsサーバの共同市場開拓プロジェクト発足
Itaniumは当初目標を上回る浸透、と推進団体が報告
基幹システムの「その先へ」を追求する新Itanium発表
RISCサーバ市場の掌握を目指すItanium陣営の勝算
Itanium普及を後押し、「Itanium Solutions Alliance」発足



 
@ITトップ@IT Special インデックス会議室利用規約プライバシーポリシーサイトマップ