it-swarm.com.de

Float gegen Double Performance

Ich habe einige Timing-Tests durchgeführt und auch einige Artikel wie dieser (letzter Kommentar) gelesen, und es sieht so aus, als würden Float- und Double-Werte dieselbe Verarbeitungszeit in Anspruch nehmen.

Wie ist das möglich? Wie kann die CLR bei einer im Vergleich zu doppelten Werten ungenaueren und kleineren Gleitkommazahl in der gleichen Verarbeitungszeit verdoppelt werden?

88
Joan Venge

Auf x86-Prozessoren werden mindestens float und double jeweils von der FPU zur Verarbeitung in einen 10-Byte-Real konvertiert. Die FPU verfügt nicht über separate Verarbeitungseinheiten für die verschiedenen unterstützten Gleitkommatypen.

Der uralte Rat, dass float schneller ist als double, galt vor 100 Jahren, als die meisten CPUs keine eingebauten FPUs hatten (und nur wenige Leute separate FPU-Chips hatten). Die Punktmanipulation wurde in Software durchgeführt. Auf diesen Maschinen (die mit von den Lavagruben erzeugtem Steam betrieben wurden) war es schneller, floats zu verwenden. Der einzige wirkliche Vorteil von floats besteht darin, dass sie weniger Platz beanspruchen (was nur wichtig ist, wenn Sie Millionen von ihnen haben).

146
P Daddy

Ich hatte ein kleines Projekt, in dem ich CUDA verwendet habe, und ich kann mich daran erinnern, dass das Floaten dort auch schneller als doppelt so schnell war. Ausnahmsweise ist der Datenverkehr zwischen Host und Gerät geringer (Host ist die CPU und die "normale" RAM und Gerät ist die GPU und die entsprechende RAM dort) Aber selbst wenn sich die Daten die ganze Zeit auf dem Gerät befinden, sind sie langsamer. Ich glaube, ich habe irgendwo gelesen, dass sich dies in letzter Zeit geändert hat oder mit der nächsten Generation ändern soll, aber ich bin nicht sicher.

Es scheint also, dass die GPU in diesen Fällen einfach nicht mit doppelter Genauigkeit umgehen kann, was auch erklären würde, warum GLFloat normalerweise anstelle von GLDouble verwendet wird.

(Wie ich bereits sagte, ist es nur soweit ich mich erinnern kann. Ich bin nur auf dieses Problem gestoßen, als ich auf einer CPU nach float vs. double gesucht habe.)

14
Mene

Dies hängt vom 2-Bit oder 64-Bit System ab. Wenn Sie auf 64-Bit kompilieren, ist double schneller. Kompiliert auf 32-Bit unter 64-Bit (Computer und Betriebssystem), wurde die Geschwindigkeit um 30% erhöht:

    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);
    }
12
Bitterblue

Es gibt jedoch immer noch Fälle, in denen Floats bevorzugt werden. Bei der OpenGL-Codierung ist es beispielsweise weitaus üblicher, den GLFloat-Datentyp zu verwenden (der im Allgemeinen direkt auf 16-Bit-Float abgebildet wird), da er auf den meisten GPUs effizienter ist als GLDouble.

11
Cruachan