Frage

Ich habe einige Tests Timing und auch einige Artikel wie dieses (letzter Kommentar), und es sieht aus wie in Releasebuild, float und double-Werten nehmen die gleiche Menge an Verarbeitungszeit.

Wie ist das möglich? Wenn der Schwimmer weniger präzise ist und kleiner im Vergleich zu Doppel Werte, wie können Doppelzimmer in die gleiche Verarbeitungszeit der CLR bekommen?

War es hilfreich?

Lösung

Auf x86-Prozessoren zumindest float und double werden jeweils durch die FPU für die Verarbeitung real zu einem 10-Byte umgewandelt werden. Die FPU hat keine separaten Verarbeitungseinheiten für die verschiedenen Gleitkommatypen unterstützt wird.

Die uralte Beratung, dass float schneller als double vor 100 Jahren angewandt, wenn die meisten CPUs nicht eingebaut in Haben FPU (und nur wenige Menschen hatten getrennte FPU-Chips), so dass die meisten Gleitkommazahlen Manipulation in Software durchgeführt wurde. Auf diesen Maschinen (die durch Dampf erzeugt durch die Lavagruben angetrieben wurden), es beträgt schneller floats zu verwenden. Nun ist der einzige wirkliche Vorteil für floats ist, dass sie weniger Platz in Anspruch nehmen (die nur von Bedeutung, wenn Sie Millionen von ihnen haben).

Andere Tipps

hatte ich ein kleines Projekt, wo ich CUDA verwendet und ich kann mich erinnern, dass Schwimmer war schneller als das Doppelte auch da. Für einmal der Datenverkehr zwischen Host und Gerät ist niedriger (Host ist die CPU und der „normale“ RAM und Vorrichtung ist die GPU und der entsprechende RAM dort). Aber selbst wenn die Daten auf dem Gerät befindet sich die ganze Zeit, es ist langsamer. Ich glaube, ich habe irgendwo gelesen, dass dieser vor kurzem geändert hat oder sollte mit der nächsten Generation ändern, aber ich bin nicht sicher.

So scheint es, dass die GPU einfach nicht mit doppelter Genauigkeit nativ in diesen Fällen umgehen können, was auch erklären würde, warum GLfloat in der Regel eher verwendet wird als GLDouble.

(Wie gesagt, es ist nur so weit, wie ich mich erinnern kann, stolperte über diesen während für Schwimmer vs. Doppel auf einer CPU der Suche.)

Es hängt von 32-Bit oder 64-Bit System. Wenn Sie auf 64-Bit kompilieren, wird doppelt schneller sein. Zusammengestellt auf 32-Bit auf 64-Bit (Maschine und OS) aus der Zeit um 30% schneller schwimmen:

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

Es gibt noch einige Fälle, in denen Schwimmer jedoch bevorzugt werden - mit OpenGL-Codierung zum Beispiel ist es weit häufiger den GLfloat Datentyp zu verwenden (in der Regel direkt auf 16-Bit-Float abgebildet), wie es auf den meisten GPUs als GLDouble effizienter ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top