x86 GCCの最適オプション

GCCは他のコンパイラのパフォーマンスに遅れをとると広く信じられています。 この記事では、許容可能なパフォーマンスを達成するためにどのようなGCCコンパイラーの基本的な最適化を使用する必要があるかを考えます。





GCCのデフォルトオプションは何ですか?



(1)デフォルトでは、GCCは最適化レベル「-O0」を使用します。 パフォーマンスの面で明らかに最適ではなく、最終製品のコンパイルには推奨されません。

GCCは、オプション「-march = native」が渡されるまで、コンパイルが実行されるアーキテクチャを認識しません。 デフォルトでは、GCCは設定時に指定されたオプションを使用します。 GCCの構成を確認するには、次を実行します。

gcc -v

「構成:[パス] / configure ... --with-arch = corei7 --with-cpu = corei7 ...」


これは、GCCがオプションに「-march = corei7」を追加することを意味します(異なるアーキテクチャが指定されていない限り)。

x86用のほとんどのGCCコンパイラ(64ビットLinuxの基本)は、構成がアーキテクチャを定義するオプションを指定しなかったため、指定されたオプションに「-mtune = generic -march = x86-64」を追加します。 次のコマンドを使用して、GCCの起動時に渡されるすべてのオプションとその内部オプションをいつでも確認できます。

echo "int main {return 0;}" | gcc [オプション] -xc -v -Q-


要約すると、よく使用されるもの:

gcc -O2 test.c


特定のアーキテクチャの最適化なしで「test.c」を構築します。 これにより、パフォーマンスが大幅に低下する可能性があります(比較的アーキテクチャが最適化されたコード)。 無効化または制限されたベクトル化と最適化されていないコードプランニングは、間違ったアーキテクチャを指定または指定しない限り、パフォーマンス低下の最も一般的な原因です。

現在のアーキテクチャを示すには、次のようにコンパイルする必要があります。

gcc -O2 test.c -march = native


使用するアーキテクチャを指定することは、パフォーマンスにとって重要です。 唯一の例外は、ライブラリ関数の呼び出しに起動時間のほとんどすべてがかかるプログラムと見なすことができます。 GLIBCは、実行時に特定のアーキテクチャに最適な機能を選択できます。 静的リンクでは、一部のGLIBC関数には異なるアーキテクチャのバージョンがないことに注意することが重要です。 つまり、GLIBC関数の速度が重要な場合、動的アセンブリの方が優れています。

(2)デフォルトでは、32ビットモードのx86のほとんどのGCCコンパイラは、「-mfpmath = sse」なしで構成されたx87浮動小数点モデルを使用します。 GCC設定に「--with-mfpmath = sse」が含まれる場合のみ:

gcc -v

「構成:[パス] / configure ... --with-mfpmath = sse ...」


コンパイラはデフォルトのSSEモデルを使用します他のすべての場合では、オプション「-mfpmath = sse」を32ビットモードのアセンブリに追加することをお勧めします。

そのため、よく使用されます:

gcc -O2 -m32 test.c


実際の演算を使用したコードでは、パフォーマンスが大幅に低下する可能性があります。 したがって、正しいオプション:

gcc -O2 -m32 test.c -mfpmath = sse


32ビットモードでは、オプション「-mfpmath = sse」を追加することが重要です。 例外はコンパイラであり、その構成には「--with-mfpmath = sse」があります。






32ビットモードまたは64ビット?



通常、32ビットモードは、使用されるメモリの量を減らし、それを使用した作業を高速化するために使用されます(より多くのデータがキャッシュに配置されます)。

64ビットモード(32ビットと比較)では、使用可能なパブリックレジスタの数が6から14に増加し、XMMレジスタは8から16に増加します。また、すべての64ビットアーキテクチャはSSE2拡張をサポートするため、64ビットモードでは、「-mfpmathオプション」 = sse」。

タスクのカウントには64ビットモードを使用し、モバイルアプリケーションには32ビットモードを使用することをお勧めします。






最大のパフォーマンスを得るには?



最大のパフォーマンスを得るための特定のオプションセットはありませんが、GCCには使用してみるべきオプションが多数あります。 以下は、「-O2」オプションと比較したIntel Atomおよび第2世代Intel Core i7プロセッサーの推奨オプションと成長予測の表です。 予測は、GCCバージョン4.7でコンパイルされた特定のタスクセットの結果の幾何平均に基づいています。 また、コンパイラがx86-64ジェネリック用に構成されていることも想定されています。

「-O2」と比較したモバイルアプリケーションの生産性向上の予測(32ビットモードのみ。モバイルセグメントの主なものであるため):

-m32 -mfpmath = sse 〜5%
-m32 -mfpmath = sse -Ofast -flto 〜36%
-m32 -mfpmath = sse -Ofast -flto -march =ネイティブ 〜40%
-m32 -mfpmath = sse -Ofast -flto -march =ネイティブ-funroll-loops 〜43%


「-O2」と比較した計算タスクのパフォーマンス向上の予測(32ビットモード):

-m32 -mfpmath = sse 〜4%
-m32 -mfpmath = sse -Ofast -flto 〜21%
-m32 -mfpmath = sse -Ofast -flto -march =ネイティブ 〜25%
-m32 -mfpmath = sse -Ofast -flto -march =ネイティブ-funroll-loops 〜24%


「-O2」と比較した計算タスクのパフォーマンス向上の予測(64ビットモード):

-m64 -fast -flto 〜17%
-m64 -Ofast -flto -march =ネイティブ 〜21%
-m64 -Ofast -flto -march =ネイティブ-funroll-loops 〜22%


「-O2 -mfpmath = sse」オプションを使用してタスクを計算する場合の32ビットモードに対する64ビットモードの利点は、約5%です

この記事のデータはすべて、特定のベンチマークセットの結果に基づく予測です。

以下は、この記事で使用されているオプションの説明です。 詳細な説明(英語): http : //gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html "




All Articles