件名を読んだ後、インテルの浮動小数点型から整数型への変換に標準のCまたはC++キャストを使用することは非常に遅いという多数の情報源からの圧倒的な証拠があります。インテルCPUは、ANSI/ISO仕様を満たすために、FPUハードウェアの丸めモードを切り替えるために必要な命令を含む多数の命令を実行する必要があります。gccでlprintがインライン展開されるようにするにはどうすればよいですか?
さまざまなドキュメントにいくつかの回避策がありますが、最もクリーンで可搬性の高いものは、C99およびC++ 0x標準に追加されたlrint()呼び出しのようです。多くの文書では、コンパイラは、最適化が有効になっているときにこれらの関数をインライン展開して、従来型のキャストや関数呼び出しよりも高速なコードにする必要があると述べています。
このインライン展開をgccオプティマイザに追加するためのgcc機能トラッキングバッグへの参照が見つかりましたが、自分のパフォーマンステストでは動作させることができませんでした。すべての私の試みは、単純なCまたはC++スタイルのキャストよりもはるかに遅くなるように、lrintのパフォーマンスを示しています。コンパイラのアセンブリ出力を調べ、コンパイルされたオブジェクトを逆アセンブルすると、常に外部lprint()またはlrintf()関数が明示的に呼び出されます。
私が扱っているgccのバージョンは4.4.3と4.6.1です。SSEを明示的に有効にするオプションを含め、32ビットと64ビットのx86ターゲットで多数のフラグの組み合わせを試しました。
は、どのように私はgccのlrintを拡張インライン、と私に高速な変換を与えることを得るのですか?
実際にプロファイリングして、かなりの量のプログラムのランタイムですか? –
プロファイリングでは、手書きのアセンブラマクロを使用して2〜4%の速度差を得ることができます。これは、3Dレンダリングアプリケーションのフレーム間で計算が実行されるときには有益です。 –
'-fno-math-errno'を設定しましたか? '-ffast-math'の使用を検討すべきです。特定のfpセマンティクスに依存している場合、常にオプションではありません。 – Christoph