2016-04-06 7 views
5

私は私の質問でできる限り明確にしようとする(容易ではない...私にとってもそれほど明確ではない)。 は私が x = a * n1 + b * n2 + c * n3(このような単一の数学関数とそれらすべてのIFを置き換えることができたと数学的関数と比較した条件付き命令の実行速度

に例えば

IF ((a==0) && (b==1) && (c==1)) THEN x=1 
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2- 

ので、複数のオペランドを持つTHEN指示...あなたはIFのセットを持っていると仮定します実際にはもっと複雑ですが、IFとオペランドももっと多くあります)

この機能は、以前に訓練された人工ニューラルネットワークからのものです。

実行にあたっては、関数はIFよりも時間がかかりますが、条件付きの命令が私に教えてくれたアセンブリでの私の古い背景から来たちょっとした感覚です算術的な時間よりも時間がかかる。

これを確認できますか?多分私が説明を見つけることができるリンクを私に提供するかもしれませんか?

ありがとうございました!

+0

私はあなたの直感は正しいと思います。私はここで、ブランチを排除したという驚くべき結果について、ここでいくつかの最適化問題に従ってきました。 –

+0

https://en.wikipedia.org/wiki/Branch_predictorとそれがリンクしている記事が始まります。相対的な利得は、機能の複雑さと考えられる分岐とに依存するが、現代のプロセッサでは、パイプライン化および分岐予測器がしばしば関連する。 – Peter

+2

多分あなたは最初にあなたのコンパイラが[これを行うことはできません]をチェックするべきです(http://stackoverflow.com/questions/26124620/why-does-msvc-emit-a-useless-movsx-before-performing-this-bitあなたのプログラムをfubarする前にテストしてください。そして、もちろん*常に*実際には違いを生むことができるかどうかを確認してください。プロファイラを使用してください。プログラマの判断は、3回測定して1回カットすることです。 –

答えて

4

あなたの腸の感触は正しいです。

現代のプロセッサにはパイプラインがあり、パイプラインで次のx命令が順番に実行の準備ができているということです。あなたがブランチ、ifステートメントを持っているなら、プロセッサは次に取るべきコードパスを知らないので、分岐予測子を使って推測しますが、それが間違っていればスローする必要がありますすべてのパイプラインを外し、正しいブランチを再び開始してください。

現代のプロセッサの分岐予測器は非常に優れていますが、一方的に行くか50/50になるかが分かれば、多くのパイプラインが停止します。

これは、特にタイトループでif文が良好であることを排除する理由です。

これは、いくつかの良い説明があるようです:http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

+0

あなたの答えを考えてみてください私はそれをチェックアウトします! – Maxyone

関連する問題