2

コンパイラが設定するシンボル、特に CPU 機能フラグ (SSE、AES、AVX など) が実際にどのように設定されるかについて質問があります。たとえば、-mavx を指定して gcc を呼び出した場合、コードをビルドしようとしているシステムが実際に AVX 命令をサポートしているかどうかに関係なく__AVX__、シンボルは設定されますか?それとも事前にチェックしますか?

CPU の機能に応じて特定のコード パスを構築する必要があり、必要な機能を手動で有効にするのではなく、ビルド システムに基づいてコンパイル時に正しいパスが決定されるように自動化したいため、質問しています。しかし、私が持っている唯一の CPU が基本的にすべての機能をサポートしているため、上記の仮定をテストすることはできません (最初の世界の問題、私は知っています)。

多くのコードが存在するため、単純にすべてを保持し、実行時に分岐することは受け入れられません。とにかく、特定のシステムで使用される前にライブラリが構築されると想定されています。

つまり、最悪の場合、gcc 引数を cpuid 対応スクリプトでラップすることでこの動作を強制できますが、gcc が自動的にそれを行う場合は、それが望ましいでしょう。それで、誰かがそうするかどうか知っていますか?


私はこれに対する gcc の見解に主に興味がありますが、他の C コンパイラがどのように動作するかも知りたいと思っています。

4

1 に答える 1

1

-mavxフラグ__AVX__を渡すと、結果のコンパイルに対して常に設定されます (結果のコードは非 AVX マシンでは実行されない場合があります)。

フラグを渡すと-march=native、gcc はビルド マシンでサポートされている命令セットを有効にするため__AVX__、ビルド マシンがサポートしている場合にのみ設定されます。

于 2012-08-04T04:59:38.590 に答える