HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。

新着トピックス

コンパイラを変えるだけでパフォーマンス向上、インテル コンパイラーの実力を見る

 「よりパフォーマンスの高いプログラムを作成するにはアセンブラを駆使すべし」という話を聞いたことがある人も多いだろう。これは、C/C++言語で記述されたプログラムには冗長な部分があるため、ノウハウを持つプログラマがアセンブラでチューニングしたプログラムの方が高いパフォーマンスを得られる、ということであった。しかし、現在では必ずしもこのことは当てはまらなくなっている。その理由は、コンパイラの進化と、CPUおよびPCアーキテクチャの複雑化にある。

 最近のコンパイラのほとんどは最適化機能と呼ばれる、ソースコードをより効率の良い形に自動変換する機能を備えている。基本的な最適化の例としては、プログラム内で実際には使われていない処理の省略や、冗長なforループの自動展開などが挙げられるが、最近ではこのほかにも高速に処理を行えるようプログラムの実行順序を入れ替えたり、頻繁に呼び出される関数を自動的にインライン展開する、といった高度な最適化機能を持つコンパイラも増えている。

 また、CPUやPCアーキテクチャが複雑になるにつれ「どのようなコードがより効率的に実行できるか」ということを予測しにくくなっているというのも、コンパイラの最適化が有用な理由の1つだ。最近のCPUは命令コードを別のマイクロコードに変換して実行するため、「最適のように見える」コードが、実はCPU的には全然最適ではない、という結果も往々にしてある。さらにメモリキャッシュを有効利用しているかどうかでもパフォーマンスは大きく変化するほか、複数スレッドを同時実行できる環境ではスレッドの有効活用なども考えなければならない。

 広く使われているC/C++コンパイラとして、Windows環境ならマイクロソフトのVisual C++、LinuxやMac OS X環境であればGCCが有名だ。Visual C++やGCCは入手しやすいこともあり、多くのユーザーがこれらのコンパイラを使っていることだろう。これらのコンパイラにも最適化機能は備わっているが、最新のマルチコアCPU向けの最適化・並列化を行ってパフォーマンスを追求したいなら、インテルが開発し、インテル製CPUに向けた高い最適化を謳う「インテル コンパイラー」という製品がある。

 インテル コンパイラーは、CPUメーカーが開発しているということで、最新のCPUへ向けた最適化やそれらが備えるSSE 4.1といった命令セットへの対応、そして自動並列化機能など、パフォーマンスの高いバイナリコードを生成する機能を備えている。パフォーマンスが必要とされる分野での採用例も多く、たとえばOracleは同社のデータベース製品のコンパイルにインテル コンパイラーを採用している。

 しかし、コンパイラを変えることで本当にパフォーマンスが変わるのか、またその違いはどの程度なのか気になる方も多いだろう。そこで以下では工学分野などで使われる数値演算プログラムを例に、生成したコードのパフォーマンスを検証してみたい。