0

私は最適化に関するウィキペディアのページを読んでいました: http://en.wikibooks.org/wiki/Optimizing_C%2B%2B/Code_optimization/Pipeline そして、次の行に出くわしました:

パイプライン化されたプロセッサの場合、比較は分岐を意味するため、差よりも遅くなります。

比較が分岐を意味するのはなぜですか? たとえば、次の場合:

int i = 2;
int x = i<5;

この中に支店はありますか?条件付きの if ステートメントで分岐するのは理にかなっていますが、比較だけで分岐する理由がわかりません。

4

4 に答える 4

3

これには、単一のブランチのみが含まれます。

unsigned(i – min_i) <= unsigned(max_i – min_i)

これには次の 2 つが含まれます。

min_i <= i && i <= max_i

CPU が分岐に遭遇すると、その予測子を調べて、最も可能性の高いパスに従います。予測が正しければ、分岐はパフォーマンスに関して本質的に自由です。予測が間違っている場合、CPU はパイプラインをフラッシュして最初からやり直す必要があります。

この種の最適化は諸刃の剣です --- 分岐が非常に予測可能である場合、最初の分岐は実際には 2 番目の分岐よりも遅くなる可能性があります。それは、データについてどれだけ知っているかに完全に依存します。

于 2015-01-14T16:10:03.507 に答える
1

そのページを書いた人は、プログラマーとしての能力がありません。まず、比較必ずしも分岐を意味するわけではありません。それはあなたがそれらをどうするかによります。そして、それが分岐を意味するかどうかは、プロセッサとコンパイラに依存します。通常は分岐がif必要ですが、それでも優れたオプティマイザーはそれを回避できる場合があります。Awhileまたは a forは通常、コンパイラがループをアンワインドできない限り、分岐を必要としますが、その分岐は非常に予測可能であるため、分岐予測が問題になる場合でも、問題にならない場合があります。

より一般的に言えば、コードを記述するときにこのレベルで何かを心配すると、時間を無駄にし、メンテナンスがはるかに困難になります。心配する必要があるのは、パフォーマンスの問題が発生したときだけです。プロファイラーは、パフォーマンスが低下している場所を示しています。その時点で、コードを記述するいくつかの異なる方法を試して、コンパイラとハードウェアの組み合わせでどの方法がより高速なコードになるかを判断できます。(コンパイラまたはハードウェアを変更すると、同じものではない可能性があります。)

于 2015-01-14T18:06:37.373 に答える