私は変数uint8がどのように動作しているかを研究していて、実際にはintより高速ではないことに気付きました!乗算、除算、加算、または減算を行うには、プログラムはuint8をintに変換しなければなりません。これにより、ほぼ同じ速度またはわずかに遅くなります。uint8の最適化がないのはなぜですか?
なぜC++はuint8に直接乗算、除算、加算、または減算を実装していないのですか?
私は変数uint8がどのように動作しているかを研究していて、実際にはintより高速ではないことに気付きました!乗算、除算、加算、または減算を行うには、プログラムはuint8をintに変換しなければなりません。これにより、ほぼ同じ速度またはわずかに遅くなります。uint8の最適化がないのはなぜですか?
なぜC++はuint8に直接乗算、除算、加算、または減算を実装していないのですか?
なぜC++はuint8に直接乗算、除算、加算、または減算を実装していないのですか?
これを行う最適な方法はプラットフォーム固有のものなので、
ほとんどのCPUは、特定のデフォルトサイズ(16ビット命令の場合はhereのように32ビットまたは64ビット)の整数値を使用することに基づいてこれらの操作をアセンブラ命令として提供しますが、uint8
値。
ビットサイズは通常、CPUのキャッシュライニングメカニズム用に最適化されています。
したがって、最適な実装は、使用可能なターゲットCPU命令に依存し、C++標準ではカバーできません。
@Kevinそれは私の答えでリンクしているARMの16ビットサンプルと一致します。 –
私は、コンパイラが適切な場合(uint8_tは8bit算術演算を生成しません)、確かではありません(高速である可能性はほとんどありません)。
@haroldが言いました、私が前に言ったことは今ではそうではありません...部分的なレジスタ更新の問題はもはや今や8ビット操作ではそれほど深刻ではありません。したがって、ほとんどの8ビット演算は高速ではありません。 8ビット除算は少し速いですが、なぜ私はMSのコンパイラがそれを使用しないのか理解しようとしています。 (部分的に更新されている問題は、ほとんどが完全に削除されず、AMDによって保持されているだけでも、8ビット除算の1つのサイクルの利点は悪用される価値がないため)。オリジナル
: モーデンのx86プロセッサでは、8ビットの操作は、あなただけfalse dependency
真剣に影響を与えるのパフォーマンスになり、完全なレジスタの一部を変更partial register update
と呼ばれる問題に直面しています。
そしてFYI、言語レベルでC++のintよりも小さい整数型のための演算が存在しません。タイプを持ち上げるにはusual arithmetic promotion
があります。
偽の依存関係は、実際にAMD(先祖Zenが何をするかも知っていない)とNetBurst(P3とCore2とその子孫)でのみ発生し、8ビットレジスタは独立して名前を変更することができ、 *分割されたレジスタ(部分的に更新した後にフル・レジスタを使用する)で、* * Haswellの方が高速です。 – harold
@harold私は真剣に日付を記入していますね... – BlueWanderer
AMDは今のところ、完全に過去のことではない – harold
最適化は一般的にプラットフォーム固有です。大部分のプラットフォームでは、CPUアーキテクチャは8ビットよりも大きい。それは物理的に 'uint8'より大きい値を使用します。これはC++標準の範囲外にあります。 –
これは、C++ではなく32ビット/ 64ビットで動作するCPUであると思われます。つまり、プラットフォームをターゲットにしているときはコンパイラは何もできません。 – fwgx
@FrançoisAndrieuxそれは正しいですが、私はなぜC++がuint8を一緒に追加、減算、乗算、または分割する直接的な方法を作っていないのだろうと思います。 –