フロートvsダブルパフォーマンス


91

私はいくつかのタイミングテストを行い、このようないくつかの記事(最後のコメント)も読みました。リリースビルドでは、float値とdouble値の処理時間は同じです。

これはどのようにして可能ですか?floatがdouble値と比較して精度が低く、小さい場合、CLRはどのようにして同じ処理時間でdoubleを取得できますか?


10
私はこの1つは、それが実際に高速です場合、他のユーザーが求めているとしてその背後にある理由を尋ねるあるとして、それは正確な複製だと思うが、していないとは限らない理由を、
ジョアンVenge

おそらくA#の正確な複製はC#のfloatよりも速いですか?(2009年に別のユーザーによって請求されました)。
Peter Mortensen

回答:


153

少なくとものx86プロセッサ、上、float及びdouble各処理のためのFPUによって、10バイトの実数に変換されます。FPUは、FPUがサポートするさまざまな浮動小数点型に対して個別の処理ユニットを備えていません。

昔からアドバイスfloatよりも高速でdouble適用された100年前にほとんどのCPUはFPUを内蔵しているしませんでした(と少数の人々は別のFPUチップを持っていた)ときは、そのほとんどの浮動小数点操作がソフトウェアで行われました。これらのマシン(溶岩ピットで生成された蒸気を利用)では、s を使用し高速floatでした。floatsの唯一の真の利点は、占有するスペースが少ないことです(数百万の場合にのみ問題になります)。


9
おそらく100年前ではない...一部のFPUは、float、double、および80ビットレベルでのネイティブ処理をサポートし、短い長さでより高速に実行されます。いくつかは実際には、より短い長さでいくつかのことを遅く実行します... :-)
ブライアン・ノブラウチ

4
可能な例外:除算の時間はビット数(1クロックサイクル/ 2ビット)に依存すると思います。私がフロート対ダブル除算で作ったタイミングはこれと一致しているようです。
Neil Coffey、

21
SIMDコードに関する警告-2倍の浮動小数点数を2倍の浮動小数点数をSIMDレジスタ(SSEなど)にパックできるため、浮動小数点数での操作はより高速になる可能性があります。しかし、これはC#であるため、おそらく起こりません。
Calyth、2009年

13
@Pダディ:キャッシュ階層のすべてのレベルでスペースの利点が重要だと思います。1次レベルのデータキャッシュのサイズが16KBで、4000の数値の配列を処理する場合、floatは簡単に速くなります。
Peter G.11年

4
@artificialidiot決して決して言わない;)。SIMDは.NETで4.6以降サポートされています
ghord

13

私はCUDAを使用する小さなプロジェクトを持っていましたが、フロートも2倍よりも速いことを覚えています。かつては、ホストとデバイス間のトラフィックが低くなります(ホストはCPUであり、「通常の」RAMであり、デバイスはGPUであり、対応するRAMがあります)。ただし、データが常にデバイス上にある場合でも、速度は遅くなります。これが最近変わった、または次の世代で変わると思われることをどこかで読んだと思いますが、よくわかりません。

したがって、これらの場合、GPUは倍精度をネイティブで処理できないようであり、GLDoubleではなくGLFloatが通常使用される理由も説明します。

(私が言ったように、それは私が覚えている限りですが、CPUでfloatとdoubleを検索しているときにこれに遭遇しました。)


5
GPUはFPUとはまったく異なる動物です。他の人が述べたように、FPUのネイティブ形式は80ビットの倍精度です。そして、それは今では長い間です。ただし、GPUは単精度からこの分野に取り組みます。ですよく知られて自分のDP FP(倍精度浮動小数点)のパフォーマンスは、多くの場合、SP FP性能のちょうど半分であること。彼らはしばしばSP浮動小数点ユニットを持っているようで、倍精度をカバーするためにユニットを再利用する必要があります。これにより、1つと比較して正確に2つのサイクルが生成されます。これはパフォーマンスの大きな違いであり、直面したときに私を驚かせました。
Csaba Toth 2013

1
一部の科学計算にはDP FPが必要であり、主要なGPUメーカーはその周りのパフォーマンスの低下を宣伝していませんでした。現在、彼ら(AMD、nVidia)は、そのDP対SPのトピックについて多少改善しているようです。インテルXeon Phiの多くのコアにはPentiumのFPUが含まれており、Intelが倍精度機能であることを強調していることに注意してください。それはおそらくそれが本当にGPGPUモンスターと競争することができる場所です。
Csaba Toth 2013

12

ただし、浮動小数点が好まれる場合もあります。たとえば、OpenGLコーディングでは、GLDoubleよりもほとんどのGPUで効率的であるため、GLFloatデータ型(通常は16ビット浮動小数点に直接マップされます)を使用するのがはるかに一般的です。


3
多分データスループットが高いのでしょうか?数値のマトリックス(zバッファーなど)がある場合、データサイズがより重要になり、floatとdouble間の変換を回避することで処理が高速化します。私の推測。
Lucero、

2
間違いなくスループット。それはCPUのよりのGPU上の短い電源である、特にとして-また、山車の上にダブルスを使用することから得られるために目に見えるそう何がなぜメモリを無駄にしている専門的な文脈与えられた
クルアチャン

1
スループット、および SP FP(単精度浮動小数点)は、DP FP(倍精度)よりもGPU内部FPUのネイティブフォーマットであるという事実。@Meneの回答に対する私のコメントを参照してください。GPUとCPU FPUは非常に異なる動物であり、CPUのFPUはDP FPで考えています。
Csaba Toth 2013


12

32ビットまたは64ビットシステムによって異なります。64ビットにコンパイルする場合、doubleの方が高速です。64ビット(マシンとOS)で32ビットにコンパイルすると、フロートが約30%速くなります。

    public static void doubleTest(int loop)
    {
        Console.Write("double: ");
        for (int i = 0; i < loop; i++)
        {
            double a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
            a = Math.Sin(a);
            b = Math.Asin(b);
            c = Math.Sqrt(c);
            d = d + d - d + d;
            e = e * e + e * e;
            f = f / f / f / f / f;
        }
    }

    public static void floatTest(int loop)
    {
        Console.Write("float: ");
        for (int i = 0; i < loop; i++)
        {
            float a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
            a = (float) Math.Sin(a);
            b = (float) Math.Asin(b);
            c = (float) Math.Sqrt(c);
            d = d + d - d + d;
            e = e * e + e * e;
            f = f / f / f / f / f;
        }
    }

    static void Main(string[] args)
    {
        DateTime time = DateTime.Now;
        doubleTest(5 * 1000000);
        Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);

        time = DateTime.Now;
        floatTest(5 * 1000000);
        Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);

        Thread.Sleep(5000);
    }

2
これらの30%は、使用する追加のキャストが原因であると考えましたか?
Rasmus Damgaard Nielsen 2014

@RasmusDamgaardNielsen Mathdoubleで動作するため、キャストは問題の一部です。しかし、あなたは私の投稿を誤って読みました。私のテストでは、パフォーマンスが向上していることがわかりました。
Bitterblue 2014年

2
上記の結果は偽物です。私のテストでは、リリースモードの.NET 4.0が搭載された古い32ビットマシンでは、floatdoubleパフォーマンスはほぼ同じであることが示されています。多くの独立したトライアルで平均すると0.3%未満の差で、各トライアルは連続的にチェーンされた変数に対して乗算、除算、および加算の演算を実行しました(コンパイラの最適化が邪魔にならないようにするため)。私はとテストの第2のセットを試してみましたMath.Sin()Math.Sqrt()しても同じ結果を得ました。
スペシャルソース:2:
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.