HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

Compilerの種類、Versionに関する話(その1)

お客様とソース配布のアプリケーションについて話をしていると、
” アプリケーションビルドに、この Compilerでは問題ないですか “
” アプリケーションビルド時に、Compiler の差はどの程度ありますか “
という質問を受けることがあります。

今回はこの点について書いていきたいと思います。

話の前提として、” 特定のアプリとCompilerの組み合わせ” については、組み合わせ数が膨大となり、ここでは書ききれません。
あくまで一般論となってしまうことはご了承下さい。

また、Compiler が問題ない、と判断する基準は、

  • 安定して動作する事
  • パフォーマンスが一定値以上出る事(パフォーマンスが極端に遅すぎない事)

という事にします。
後者は、コンパイラによる多少の性能差は考えず、明らかに遅い場合のみに問題とする、という意味です。

 

  • 安定して動作するかどうか?

理論上は、あるプログラム言語で書かれたソースコードは、その言語に対応したCompilerを用れば、種類によらず動作する筈です。
しかし、実際は、ソースコードとCompilerの組み合わせによって、上手動かないことがあります。
ハードウェアの組み合わせでも見られる、所謂、” 相性 ” といわれているものだと考えています。

安定して動作するかどうか、については、厳密には、
実際にビルドを行い動作を確認してみないと分からないのですが、
ビルドをする前に幾つか判断材料となる点があります。
判断材料は以下のようになります。

  1. 開発元が検証している環境( Compiler、ハードウェア環境 )は何か?
  2. インストールするアプリケーション、Compiler、OSのリリース時期はいつか?

1. については、アプリケーションのビルドを行う際に、もっとも参考になる情報といえます。開発元が実際に開発を行っている環境と同等の環境であれば、ビルドは問題なく通ると考えて問題ありません。

最近ですと、AmberTools Version 18、Version 19 において、IntelCompiler Version 18.0.X を使用してビルドを実行すると、
IntelCompiler 18.X を使わないように指摘するメッセージを出力しビルドが停止する 、という例があります。( IntelCompiler Version 17.0.X、19.0.X は問題ありません。)
このメッセージ、挙動は開発陣がソースコードで設定しているため、
この組み合わせでビルドが停止する事が、” 開発元が想定した、正常な挙動 ” となります。
このように、開発元が動作確認している、想定している環境のチェックは非常に重要となります。

開発元の検証環境が公表されている場合もありますが、そうでないケースの場合、
ソースコード内にある、解説文章( ReleaseNotes、README 等)やビルド設定ファイル( configure、Makefile 等 ) から推測する事になります。 

Linux環境を想定した科学技術計算アプリケーションにおける最近の傾向では、開発元が使用しているコンパイラはGCC ( GNU Compiler Collection ) か Intel Compiler であることが多いようです。

2. については、
“古い環境(古いOS、ハードウェア)に、最新のアプリケーションをインストール “
または、逆に、
“新しい環境に、昔のアプリケーションをインストールしたい”
という場合に問題になることがあります。
この問題の原因は、主にCompiler規格の差異とOSのVersionによるものです。

計算科学アプリケーションにおいてよく使用されている言語は
C/C++ と Fortran ですが( Python は Compiler が関係ないので除外します)、
これらの言語には、C++11、Fortran2003 等の規格があります。
この規格が新しくなった場合、新しい文法、関数の追加、従来認められていた文法の廃止、等々、ソースコードの解釈が変更になる場合があります。

新しいCompilerは、基本的に新しい規格に対応し、標準規格と解釈しようとします。
勿論、Compiler側も古い規格とのズレを吸収しようと努力していますが、
このズレを吸収できない場合、Compileできなかったりプログラムが誤動作したりします。

次に、OSのVersion についてです。
計算科学アプリケーションはOSやその他外部のライブラリをリンクする場合が非常に多いです。
アプリケーションがリリースされた時期とOSのリリースされた時期が大きく異なる場合、リンクするライブラリのVersionの差により問題が発生する事があります。
このケースでは、要求するライブラリのVersionが古いOSに対応していないこともあり、解決が非常に困難になる場合もあります。

 

 

記事が長くなりましたので、Compilerがパフォーマンスに与える影響に関する話はまた次回に…