15

タイプを使用するよりもタイプを使用するfloat方が遅いdoubleですか?

最近のIntelおよびAMDCPUは、floatよりもdoubleを使用して計算を高速に実行できると聞きました。

sqrt標準の数学関数(、、、、、などpow)はどうですか?単精度での計算は、浮動小数点演算が少なくて済むため、かなり高速になります。たとえば、単精度は倍精度よりも単純な数式を使用できます。また、標準の数学関数は64ビットモードの方が高速であると聞きました(コンパイルして64ビットOSで実行した場合)。これについての決定的な答えは何ですか?logsincossqrtsqrt

4

6 に答える 6

11

従来のx86アーキテクチャでは、浮動小数点ユニット(FPU)を使用して浮動小数点計算を実行します。FPUは、それぞれ80ビットの精度を持つ内部レジスタですべての計算を実行します。floatまたはを操作しようとするたびdoubleに、変数は最初にメモリからFPUの内部レジスタにロードされます。これは、いずれの場合も計算が完全な80ビットの精度で実行されるため、実際の計算の速度にまったく違いがないことを意味します。異なる可能性がある唯一のことは、メモリから値をロードし、結果をメモリに保存する速度です。double当然、32ビットプラットフォームでは、に比べてロード/保存に時間がかかる場合がありますfloat。64ビットプラットフォームでは、違いはありません。

最新のx86アーキテクチャは、「古い」FPU命令を使用せずに、まったく同じ浮動小数点計算を実行できる新しい命令を備えた拡張命令セット(SSE / SSE2)をサポートしています。ただし、ここでも、との計算速度に違いは見られないと思いfloatますdouble。また、これらの最新のプラットフォームは64ビットプラットフォームであるため、ロード/ストアの速度も同じであると想定されています。

別のハードウェアプラットフォームでは、状況が異なる可能性があります。ただし、通常、小さい浮動小数点型ではパフォーマンス上の利点はありません。小さい浮動小数点型の主な目的は、パフォーマンスを向上させることではなく、メモリを節約することです。

編集:(@MSaltersコメントに対処するため)上記で述べたことは、基本的な算術演算に適用されます。ライブラリ関数に関しては、答えはいくつかの実装の詳細に依存します。プラットフォームの浮動小数点命令セットに、特定のライブラリ関数の機能を実装する命令が含まれている場合、上記で述べたことは通常、その関数にも適用されます(通常、、、などの関数が含まれますsin)。FP命令セットで機能がすぐにサポートされていない他の機能の場合、状況が大幅に異なることが判明する可能性があります。そのような関数のバージョンは、それらのバージョンよりも効率的に実装できる可能性があります。cossqrtfloatdouble

于 2011-04-21T01:29:36.667 に答える
6

あなたの最初の質問はすでにここSOで答えられています。

2番目の質問は、使用しているデータの「サイズ」に完全に依存しています。それはすべて、システムの低レベルのアーキテクチャと、それが大きな値を処理する方法に要約されます。32ビットシステムの64ビットデータは、2つのレジスタにアクセスするために2サイクルを必要とします。64ビットシステム上の同じデータは、1つのレジスタにアクセスするのに1サイクルしかかかりません。

すべては常にあなたがしていることに依存します。迅速で厳格なルールはないので、現在のタスクを分析し、その特定のタスクのニーズに最適なものを選択する必要があります。

于 2011-04-21T01:19:17.380 に答える
3

私がJavaで行ったいくつかの調査と経験的測定から:

  • doubleとfloatの基本的な算術演算は、除算を除いて、Intelハードウェアで基本的に同じように実行されます。
  • 一方、iPhone 4およびiPadで使用されているCortex-A8では、ダブルスでの「基本的な」演算でさえ、フロートの場合の約2倍の時間がかかります(フロートでのレジスターFPの加算は約4nsかかるのに対し、レジスターFPはダブルテイク約9ns);
  • java.util.Math(三角関数など)でメソッドのタイミングをいくつか作成しましたが、これは興味深いかもしれません-原則として、これらのいくつかは、の精度で計算するために必要な項が少ないため、フロートではより高速になる可能性がありますフロート; 一方、これらの多くは「思ったほど悪くはない」という結果になります。

また、メモリ帯域幅の問題が「生の」計算時間よりも重要であるという特別な状況が存在する可能性があることも事実です。

于 2011-04-21T03:00:05.003 に答える
2

ほとんどのシステムでは、個々の値doubleと同じ速度になりfloatますが、単精度での、などの計算関数はsqrtsin倍精度で計算するよりもはるかに高速である必要があります。C99では、変数が、であっても、、などの関数を使用してsqrtf、メリットを得ることができます。sinfdouble

私が言及したもう1つの問題は、メモリ(および同様にストレージデバイス)の帯域幅です。処理する値が数百万または数十億ある場合、すべてがメモリバウンドまたはIOバウンドになるため、floatほぼ確実に2倍の速度になります。doubleこれはfloat、配列またはディスク上のストレージの型として使用するのに十分な理由floatですが、計算を行う変数に使用するのは適切な理由ではないと思います。

于 2011-04-21T01:27:04.280 に答える
1

x86FPUの「ネイティブ」内部浮動小数点表現は80ビット幅です。floatこれは、 (32ビット)とdouble(64ビット)の両方とは異なります。値がFPUに出入りするたびに、変換が実行されます。sin演算を実行するFPU命令は1つだけで、内部の80ビット表現で機能します。

この変換が速いかどうかは多くの要因floatdouble依存し、特定のアプリケーションで測定する必要があります。

于 2011-04-21T01:20:24.570 に答える
0

プロセッサによって異なります。プロセッサにネイティブの倍精度命令がある場合、通常、floatを指定して倍精度に変換し、倍精度演算を実行してから、floatに戻すよりも、倍精度演算を実行する方が高速です。 。

于 2011-04-21T01:17:31.340 に答える