11

みなさん、こんにちは :)
浮動小数点、SIMD/数学組み込み関数、および gcc の高速数学フラグに関するいくつかの概念を理解しようとしています。より具体的には、x86 CPU で gcc v4.5.0 で MinGW を使用しています。

私はしばらくの間検索してきましたが、それが私が(私が思うに)現時点で理解していることです:

フラグなしでコンパイルすると、fp コードは標準の x87 になり、simd 組み込み関数はなくなり、math.h 関数は msvcrt.dll からリンクされます。

mfpmathmssen、および/またはmarchを使用して mmx/sse/avx コードを有効にすると、gcc はOnftree-vectorizeなどの最適化フラグも指定した場合にのみsimd 命令を実際に使用します。その場合、組み込み関数は gcc によって自動的に選択され、一部の数学関数 (math.h の標準の数学関数についてまだ話している) は組み込み関数になるか、インライン コードによって最適化されますが、他のいくつかは msvcrt から取得されます。 dll. 最適化フラグを指定しない場合、これは変更されますか?

特定の simd データ型 ( v4siv8qiなどの gcc 拡張機能として利用できるもの) を使用する場合、組み込み関数を直接呼び出すか、自動決定を gcc に任せるかを選択できます。適切なフラグを介して simd 命令を有効にしない場合でも、Gcc は標準の x87 コードを選択できます。繰り返しますが、最適化フラグを指定しない場合、これは変化しますか?

私の発言のいずれかが間違っている場合は、私を修正してください:p

今質問:

  1. 組み込み関数を使用するために x86intrin.h を含める必要はありますか?
  2. libm をリンクする必要はありますか?
  3. 速い数学は何かと関係がありますか? それがIEEE標準を緩和することは理解していますが、具体的にはどのように?その他の標準機能は使用されていますか? 他のライブラリがリンクされていますか?それとも、いくつかのフラグがどこかに設定されているだけで、標準の lib の動作が異なるのでしょうか?

助けてくれる人に感謝します:D

4

1 に答える 1

6

わかりました、私のようにこれらの概念を理解するのに少し苦労している人のために答えます。

Ox による最適化は、あらゆる種類のコード、fpu または sse で機能します

fast-math は x87 コードでのみ動作するようです。また、fpu 制御ワード o_O を変更していないようです

ビルトインは常に含まれます。この動作は、strict や no-builtins などのいくつかのフラグを使用して、一部のビルトインで回避できます。

libm.a は glibc に含まれていないものに使用されていますが、mingw では単なるダミー ファイルなので、現時点ではリンクしても意味がありません。

gcc の特別なベクトル型を使用することは、組み込み関数を直接呼び出す場合にのみ有効に思われます。それ以外の場合、コードはとにかくベクトル化されます。

修正は大歓迎です:)

便利なリンク:
fpu / sse control
gcc math
および "Vector Extensions"、"X86 Built-in functions"、"Other Builtins" に関する gcc マニュアル

于 2011-02-11T20:12:07.507 に答える