GCCのi386/x86-64向けCPU別の最適化オプション(GCC 4.2.0)
簡単なまとめ。
参考: http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/i386-and-x86_002d64-Options.html
検索サイトから飛んできた方へ:
特定のCPU向けの最適オプションをお探しでしたら、Safe Cflags - Gentoo Linux Wikiの下にあるProcessor Specific CFLAGSをご覧ください。
CPUの種類
-mtune=(cputype)
生成するコードを指定されたCPU向けに最適化(ABIと命令セット以外)します。-mcpuと同義です。
-march=(cputype)
指定されたCPU だけで動作するようなコードを生成します。-mtuneも同時に指定されます。
-marchでは、CPUの種類としてgenericを指定することはできません。
このオプションを指定しない場合、コンパイラはIntel i386で動作するようなコードを生成します。
指定できるCPUの種類
-mtune, -march共に共通です。
generic | もっとも一般的なIA32/AMD64/EM64T(今後のGCCのバージョンアップで挙動が変わる可能性あり。GCC 4.2.0ではi686) |
native | コンパイルを実行したマシン(CPUID命令で判別) |
i386 | オリジナルのIntel i386 |
i486 | Intel i486(スケジューリングは未実装) |
i586, pentium | Intel Pentium(MMXなし) |
pentium-mmx | Intel PentiumMMX |
pentiumpro | Pentium Pro |
i686 | (GCC 4.2.0では)genericと同義(-marchオプションで使われた場合は、pentiumproと同義) |
pentium2 | Intel Pentium2 (with MMX) |
pentium3, pentium3m | Intel Pentium3 (with MMX, SSE) |
pentium-m | Centrinoなどの、低電力版Pentium3 (with MMX, SSE, SSE2) |
pentium4, pentium4m | Intel Pentium4 (with MMX, SSE, SSE2) |
prescott | Intel Pentium4の改良版 (with MMX, SSE, SSE2, SSE3) |
nocona | Intel Pentium4の改良版 (with MMX, SSE, SSE2, SSE3, 64bit拡張) |
k6 | AMD K6 (with MMX) |
k6-2, k6-3 | AMD K6の改良版 (with MMX, 3DNow!) |
athlon, athlon-tbird | AMD Athlon (with MMX, 3DNow!, Enhanced 3DNow!, SSE prefetch) |
athlon-4, athlon-xp, athlon-mp | AMD Athlonの改良版 (with MMX, 3DNow!, Enhanced 3DNow!, SSE) |
k8, opteron, athlon64, athlon-fx | AMD K8ベースの64bitCPU (with MMX, 3DNow!, Enhanced 3DNow!, SSE, SSE2, 64bit拡張のスーパーセット) |
winchip-c6 | IDT WinChip C6 (i486 with MMX と同様) |
winchip2 | IDT WinChip2 (i486 with MMX, 3DNow! と同様) |
c3 | Via C3 (with MMX, 3DNow! スケジューリングは未実装) |
c3-2 | Via C3-2 (with MMX, SSE スケジューリングは未実装) |
genericとnativeはGCC 4.2.0から追加されました。それ以外のcputypeはGCC 3.4.6でも利用できます。
Intel Core2向けにcore2が、AMD Geode向けにgeodeがGCC 4.3で追加されました。
SSE関係
-mfpmath=(387|sse|sse,387)
浮動小数点数演算を、指定されたユニットで行うコードを生成します。
387 | (Default@i386)387向けのコード |
sse | (Default@x86-64)SSE命令セットを用いたコード(-msse{,2,3}を指定する必要あり) |
sse,387 | (experimental)両方の命令セットを同時に利用するようにしたコード(利用できるレジスタ数が倍になり、CPU資源を有効活用できる) |
sseを指定して生成されるコードはほとんどの場合かなり高速で、かつ387の数値安定性の問題を回避できますが、レジスタが80bitであるという前提で書かれたコードで問題が起きる可能性があります。また、SSEでは、倍精度浮動小数点数演算や拡張精度浮動小数点数演算(double and extended precision arithmetics)を387で行います。SSE2以降で、倍精度浮動小数点数演算がサポートされます。
-mmmx
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-m3dnow
-mno-3dnow
MMX, SSE, SSE2, SSE3, 3DNow!を有効にするかどうかを設定します。
CPU判別コードを持つプログラムは、これらのオプションを使わずにコンパイルすべきです。