ループの最適化を実行しようとしていたプログラムがあります。これは C++ で記述され、gcc を使用してコンパイルされています。
最終的にプロファイラーを使用して、ループの実行時間の半分以上を次の行まで追跡しました
double x_component = in.input_vector[in.dimension_to_process] - \
(center_of_bin_0 + (double) nn * grid_distance);
long unsigned int 型のループ インデックス nn を除いて、この行のすべてが double 型です。
long unsigned int から double へのキャストは、プロファイラーがフラグを立てたアセンブリ命令 fxtod を生成します
テストとして、行から nn への参照を削除したため、unsigned int から double へのキャストが削除され、Ultrasparc IV で約 12 の浮動小数点演算を実行するループで、ループの実行時間がほぼ半分に短縮されました。プロセッサ。Ultrasparc II でも同様であることを確認しましたが、
int から double へのキャストが、浮動小数点の乗算は言うまでもなく、キャッシュ ミスよりもはるかにコストがかかるのは正常ですか? もしそうなら、他の人は通常それについて何をしますか?
nn のすべての可能な値のルックアップ テーブル (この場合、既知の制限された範囲がある) は、これよりも高速です。