2013-04-23 3 views
5

主に単精度浮動小数点数で動作するコードがあります。超越関数への呼び出しは、かなり頻繁に発生します。今、sin()、cos()、sqrt()などを使用しています。doubleを受け入れて返します。それがx87だけのためにコンパイルされるとき、私は単精度と倍精度の間に違いがないことを知っています。私はAgner Fogの最適化ガイドを読んでいますが、SSE命令を利用したこれらの関数のソフトウェアバージョンは単精度浮動小数点数のほうが高速です。sinf()、cosf()、sin()、cos()とのパフォーマンスの差

float x = 1.23; 
float y = sin(x); 

または丸め規則は、このような最適化を妨げるものではない:

私の質問は、それはのようなものに遭遇した場合、コンパイラが自動的に高速化機能を使用するかどうか?

検索と置換を行い、パフォーマンスが向上しているかどうかを確認するだけで十分です。問題は、私もこれらの関数へのポインタが必要です。 MSVCでは、sinf()、cosf()、およびfriendsはインライン関数です。したがって、それらを使用するには少しの体操が必要です。努力する前に、私はそれが価値があるかどうかを知りたいと思います。

MSVC以外にも、gccをターゲットにしています。

+1

これらの機能を呼び出すのが本当に減速し、時間を浪費することは確実でしょうか?あなたのコードをプロファイルしましたか? –

答えて

3

sinを呼び出すときに実際にキャストする必要はありません。実際には、C99に付属の<tgmath.h>ヘッダーを使用すると逆効果になります。これは、引数に応じて適切な関数を選択するジェネリックマクロを入力します。残念なことに、ターゲット型ではありません。ですから、

float x = 1.23; 
float y = sin(x); 

(これはMSのために利用可能であるかどうかわからない)というヘッダを使用したい場合は、自動的にボンネットの下にsinfを使用します。

+0

あなたはそうです。キャストでは、コンパイラは入力が実際に倍であると思うでしょう。私は質問からそれを取り出した。 – cleong

関連する問題