コンパイルオプション
CPU拡張命令による最適化オプション
Intel Compilerを使用する際は、コンパイラオプションで最適化のレベルを指定しますが、Ver.9.xと10.x以降ではオプションの書式が変わっています。従ってコンパイル時のCFLAGSがコンパイラバージョンによって異なるので注意!
なお、CFLAGSは通常configureコマンドを実行するときに指定します。
Ver.9.x
CFLAGS="-O3 -tpp7 -xWNB -axWNB -ip"
Ver.10.x および11.x互換
CFLAGS="-O3 -xW -axT -mtune=pentium4 -parallel -no-prec-div -ip"
ただし-xW,-axTオプションはCPUによって異なるので要確認。
いろいろなオプションを入れたもの
CFLAGS="-O3 -xW -axT -openmp -parallel -no-prec-div -ipo"
ipoオプションはipよりも強力な最適化を行うみたいですが、プログラムサイズが大きくなるとコンパイルエラーが出ます。ほどほどのサイズのものなら試してみるといいかもしれません。なお、ipoオプションを付けることで計算が遅くなる場合もあるので確認した方がいいかもしれません(OpenMP版SHELXLはipoを付けた方が遅かったです)。
Ver.11.x
- 2011-10-24追記:ふと気付きましたが、現在の環境のプロセッサに自動的に最適化される-xhostオプションが増えているようです
おそらくver.10のオプションも利用可能ですが、ドキュメントによると変わっているようです。
CFLAGS="-O3 -xsse2 -axssse3 -parallel -no-prec-div -ip"
って感じになるようです。
-x {sse4.2,sse4.1,ssse3,sse3,sse2,host} | Processor-specific targetingです。このオプションで指定した命令セットに対応したCPU上でしか走りません。 |
---|---|
-m {sse3,sse2,ia32} | non-intelプロセッサ上でも最適化されたコードを使えます。 |
-ax {sse4.2,sse4.1,ssse3,sse3,sse2} | Automatic Processor Dispatchオプション。使用するプロセッサにより自動的に選択されるコードパスを追加します。複数指定の場合は-axsse4.1,sse3というようにします |
つまり、-xオプションは指定された命令セットへの対応が必須で-axオプションは命令セットに対応していればそれが実行されるというオプションだと思います。例えば-xsse2 -axssse3ならPentuim4以降のプロセッサに対応し、Core2プロセッサの場合SSSE3命令セットも使用されるということなのでしょう。
- 対象となる命令セット
命令セット Ver.11 Ver.10 内容 SSE4.2 sse4.2 Intel Core processor family. Core i7など SSE4.1 sse4.1 Intel 45nm Hi-k next generation Intel Core microarchitecture SSSE3 ssse3 T Intel Core2 processor family。SSE3の補完版 SSE3 sse3 P,O(non-intel) Pentium4 prescott。-msse3と併用できない SSE2 sse2 N,W(non-intel) Pentium4。-msse2と併用できない SSE K Pentium IIIおよびPentium III Xeon, non-intel support SSE HOST host 拡張命令セット使用せず。non-Intelでは-mオプションと同じ
現在のCPUがどの命令セットに対応しているかを確認するにはLinuxの場合、more /proc/cpuinfoで表示し、flagsの項目を見ればわかります。Intel Core2 Quadなら
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
こんな感じで、ssse3まで対応していることがわかります。
CPUと拡張命令セット(たぶん)
CPU | 拡張命令 |
PentiumII Celeron | MMX |
PentiumIII Celeron(533MHz-) | SSE |
Pentium4 Willamette Pentium4 Northwood Celeron(1.7GHz-) | SSE2 |
Pentium4 Prescott CeleronD PentiumD | SSE3 |
その他のオプション
オプション | 説明 |
-no-prec-div | 浮動小数点演算の効率化を行う。速度向上が見込めるが完全な IEEE 準拠の除算よりも多少精度が低い最適化が有効になる |
リンカオプション
オプション | 説明 |
-static-intel | Intel Compilerのライブラリのみ静的リンクにする |
-heap-arrays | スタック領域が不足してセグメントエラーでプログラムが強制終了する時に使うとよい。 巨大な配列をヒープ領域に取ることでスタック領域不足を回避します(Ver.10以降)。 それ以前のバージョンでは ifort -Wl,-stack_size,0x10000000,-stack_addr,0xc0000000 foo.f という感じでスタック領域のサイズを指定するみたいです(未確認)。 参考:Intel® Fortran Compiler - Increased stack usage of 8.0 or higher compilers causes segmentation fault |
外部サイト
- Quick-Reference Guide to Optimization with Intel Compilers ver.11(PDF) -- http://cache-www.intel.com/cd/00/00/22/23/222300_222300.pdf