みなさん、こんにちは :)
浮動小数点、SIMD/数学組み込み関数、および gcc の高速数学フラグに関するいくつかの概念を理解しようとしています。より具体的には、x86 CPU で gcc v4.5.0 で MinGW を使用しています。
私はしばらくの間検索してきましたが、それが私が(私が思うに)現時点で理解していることです:
フラグなしでコンパイルすると、fp コードは標準の x87 になり、simd 組み込み関数はなくなり、math.h 関数は msvcrt.dll からリンクされます。
mfpmath、mssen、および/またはmarchを使用して mmx/sse/avx コードを有効にすると、gcc はOnやftree-vectorizeなどの最適化フラグも指定した場合にのみsimd 命令を実際に使用します。その場合、組み込み関数は gcc によって自動的に選択され、一部の数学関数 (math.h の標準の数学関数についてまだ話している) は組み込み関数になるか、インライン コードによって最適化されますが、他のいくつかは msvcrt から取得されます。 dll. 最適化フラグを指定しない場合、これは変更されますか?
特定の simd データ型 ( v4siやv8qiなどの gcc 拡張機能として利用できるもの) を使用する場合、組み込み関数を直接呼び出すか、自動決定を gcc に任せるかを選択できます。適切なフラグを介して simd 命令を有効にしない場合でも、Gcc は標準の x87 コードを選択できます。繰り返しますが、最適化フラグを指定しない場合、これは変化しますか?
私の発言のいずれかが間違っている場合は、私を修正してください:p
今質問:
- 組み込み関数を使用するために x86intrin.h を含める必要はありますか?
- libm をリンクする必要はありますか?
- 速い数学は何かと関係がありますか? それがIEEE標準を緩和することは理解していますが、具体的にはどのように?その他の標準機能は使用されていますか? 他のライブラリがリンクされていますか?それとも、いくつかのフラグがどこかに設定されているだけで、標準の lib の動作が異なるのでしょうか?
助けてくれる人に感謝します:D