浮動小数点と整数:
歴史的に、浮動小数点は整数演算よりもはるかに遅い可能性があります。最近のコンピューターでは、これは実際にはそうではありません(一部のプラットフォームでは多少遅くなりますが、完璧なコードを記述してサイクルごとに最適化しない限り、コード内の他の非効率性によって違いが圧倒されます)。
ハイエンドの携帯電話のような多少制限されたプロセッサでは、浮動小数点は整数よりもいくらか遅いかもしれませんが、ハードウェア浮動小数点が利用可能である限り、一般に1桁以内(またはそれ以上)です。携帯電話がますます一般的なコンピューティングワークロードを実行するように求められるにつれて、このギャップはかなり急速に縮まっていることは注目に値します。
非常に限られたプロセッサ(安価な携帯電話とトースター)では、通常、浮動小数点ハードウェアがないため、浮動小数点演算をソフトウェアでエミュレートする必要があります。これは遅いです-整数演算よりも数桁遅いです。
私が言ったように、人々は自分の電話や他のデバイスがますます「実際のコンピューター」のように動作することを期待しており、ハードウェア設計者はその需要を満たすためにFPUを急速に強化しています。最後のすべてのサイクルを追跡している場合、または浮動小数点をほとんどまたはまったくサポートしていない非常に限られたCPUのコードを記述している場合を除いて、パフォーマンスの違いは重要ではありません。
異なるサイズの整数型:
通常、CPUは、ネイティブワードサイズの整数での動作が最も高速です(64ビットシステムに関するいくつかの注意事項があります)。多くの場合、32ビット演算は最新のCPUでの8ビットまたは16ビット演算よりも高速ですが、これはアーキテクチャ間でかなり異なります。また、CPUの速度を単独で考慮することはできないことを忘れないでください。それは複雑なシステムの一部です。16ビット数での操作が32ビット数での操作より2倍遅い場合でも、32ビットではなく16ビット数で表すと、キャッシュ階層に2倍のデータを収めることができます。これにより、すべてのデータを頻繁にキャッシュミスするのではなく、キャッシュから取得することに違いがある場合は、メモリアクセスが高速であるほど、CPUの動作が遅くなります。
その他の注意事項:
float
ベクトル化は、より狭いタイプ(および8ビットと16ビットの整数)を優先してバランスをさらに傾けます。同じ幅のベクトルでより多くの操作を実行できます。ただし、優れたベクターコードを作成するのは難しいため、多くの注意深い作業を行わなくてもこのメリットが得られるとは限りません。
なぜパフォーマンスの違いがあるのですか?
CPUでの操作が高速であるかどうかに影響を与える要因は、実際には2つだけです。それは、操作の回路の複雑さと、操作を高速にすることに対するユーザーの要求です。
(理由の範囲内で)チップ設計者が問題に十分なトランジスタを投入することをいとわない場合は、あらゆる動作を高速化できます。しかし、トランジスタにはコストがかかります(つまり、トランジスタをたくさん使用するとチップが大きくなります。つまり、ウェーハあたりのチップ数が少なくなり、歩留まりが低くなり、コストがかかります)。そのため、チップ設計者は、どの操作に使用する複雑さのバランスをとる必要があります。彼らは(知覚された)ユーザーの要求に基づいてこれを行います。大まかに言うと、操作を4つのカテゴリに分類することを考えるかもしれません。
high demand low demand
high complexity FP add, multiply division
low complexity integer add popcount, hcf
boolean ops, shifts
需要が高く、複雑さの低い操作は、ほぼすべてのCPUで高速になります。これらは、手間のかからない成果であり、トランジスタごとに最大のユーザーメリットをもたらします。
需要が高く複雑性の高い操作は、高価なCPU(コンピューターで使用されるものなど)では高速になります。これは、ユーザーがそれらの費用を喜んで支払うためです。トースターに追加の$3を支払って、高速FPを乗算することはおそらくないでしょう。ただし、安価なCPUはこれらの命令を無視します。
需要が少なく複雑性の高い操作は、通常、ほぼすべてのプロセッサで低速になります。コストを正当化するのに十分なメリットはありません。
需要が少なく、複雑さが少ない操作は、誰かがわざわざ考えれば高速になり、それ以外の場合は存在しません。
参考文献: