Warum hat Nvidia sowohl FP32- als auch FP64-Einheiten in den Chip eingebaut?
Ich denke, es geht um Marktdurchdringung, so viele wie möglich zu verkaufen. Ohne FP64 können Wissenschaftler der wissenschaftlichen Forschung nicht einmal eine Demo mit wissenschaftlich wichtiger gpgpu-Software versuchen, die FP64 verwendet (und sogar Spiele könnten gelegentlich doppelte Präzision verwenden). Ohne FP32 wären Spielphysik und Simulationen sehr langsam oder GPU würde einen Kernreaktor benötigen. Ohne FP16 kein schnelles neuronales Netzwerk. Wenn es nur FP32 gäbe, würde eine neuronale Netzwerksimulation mit halber Geschwindigkeit arbeiten, oder eine FP64-Summierung würde nicht funktionieren.
Wer weiß, vielleicht gibt es in Zukunft FP-Raytrace-dedizierte Kerne, die ultraschnell Raytracing durchführen, so dass DX12 DX11 DX9 keine schmerzhaften Aktualisierungen und bessere Grafiken enthält.
Letztendlich würde ich nicht nein für eine FPGA-basierte GPU sagen, die einige Kerne von FP64 in FP32 oder einige spezielle Funktionskerne für eine Anwendung konvertieren kann, dann alle FP64 für eine andere Anwendung konvertiert und sogar alles in einen einzigen Fettkern konvertiert führt sequentielle Arbeit aus (z. B. das Erstellen von Shadern). Dies würde für Leute von Vorteil sein, die auf einem Computer viele verschiedene Dinge tun. Ich brauche zum Beispiel möglicherweise mehr Multiplikationen als Ergänzungen, und FPGA könnte hier helfen. Aber jetzt spricht Geld und es heißt "Feste Funktion für jetzt" und bestes Einkommen wird mit einer Mischung aus FP64 und FP32 (und FP16 in letzter Zeit) erzielt.
Warum nicht einfach FP64-Einheiten einsetzen, die 2xFP32-Operationen pro Befehl ausführen können (wie die SIMD-Befehlssätze in CPUs).
SIMD erwartet immer dieselbe Operation für mehrere Daten und weniger Spaß für skalare GPGPU-Kernel. Um aus einem FP64 2xFP32 zu machen, würde man mehr Transistoren benötigen als reines FP64, mehr Wärme, vielleicht mehr Latenz.
Mehr Transistoren = höhere Produktionsausfallwahrscheinlichkeit, daher könnte eine 1024 FP32-GPU mit größerer Wahrscheinlichkeit als eine 512-FP64-flexible GPU hergestellt werden.
Warum kann ich nicht alle FP32- und FP64-Einheiten gleichzeitig verwenden?
Mixed-Precision-Computing kann in cuda und opencl ausgeführt werden, sodass Sie mit allen Kernen noch schneller werden können, jedoch nur für Situationen geeignet, in denen es keinen Speicherplatz gibt, was selten und schwer zu codieren ist.
Beantworten, um 1 zu bearbeiten:
Hier ist eine ausführliche Quelle: http://www.nvidia.com/content/PDF/sc_2010/CUDA_Tutorial/SC10_Accelerating_GPU_Computation_Through_Mixed-Precision_Methods.pdf
lange Geschichte kurz, fügen sie nicht hinzu, es gibt "geringere Renditen", die die Skalierung von% 100 wegen der erforderlichen "zusätzlichen Zyklen" zwischen verschiedenen Präzisionsberechnungen irgendwie nicht zulassen. Wenn sie nicht gemischt werden, benötigen sie "zusätzliche Iterationen" zwischen Blöcken, die ebenfalls keine Skalierung von% 100 zulassen. Es scheint sinnvoller zu sein, "FP64" statt "FP32" nach unten zu beschleunigen (aber da viele FP64-Kerne vorteilhaft sein sollten (für FP32), könnten Sie sie mit so etwas wie einem Body-Kernel testen (der nicht über einen Engpass im Speicher verfügt). ). FP64 ist sehr speicherintensiv (und Cachezeilen (und lokaler Speicher)). Aus diesem Grund habe ich vorgeschlagen, einige Daten für N-Zeiten (> 64k) wiederzuverwenden. Meine GPU verfügt über 1/24 FP64-Leistung, daher traue ich meinem Computer nicht. Du hast einen titan Du solltest es versuchen,
sagt "hervorragende Leistung und Genauigkeit", aber ich konnte keinen Physik-Löser für Spiele finden, die FP32 + FP32 (abgeschnittener FP64) verwenden. Vielleicht spricht das Geld noch einmal. Wenn jemand dies macht, wäre dies "herausragende Leistung und Einbruch" beim Spielen. (vielleicht schlimmer als Furmark explodierender gpus)
Menschen verwenden hier sogar ganze Zahlen (Integer-Punkt-Produkt) auf Floats: https://devblogs.nvidia.com/parallelforall/mixed-precision-programming-cuda-8/
Wie wird dies bei CUDA erreicht? Benutze ich einfach Doppel- und Floats gleichzeitig in meinem Kernel? Oder muss ich eine Flagge an NVCC übergeben?
ein Beispiel zur iterativen Verfeinerung mit fp64 + fp32 in derselben Funktion:
https://www.sciencesmaths-paris.fr/upload/Contenu/HM2012/07-dongarra_part2.pdf
Seiten 26-28.
Für den Opencl-Teil ist hier ein Evergreen (HD5000-Serie) in der Lage, in jedem Zyklus 1dp fma + 1 sp (oder 1 sf) auszugeben.
http://www.microway.com/download/whitepaper/gpgpu_architecture_and_performance_comparison_2010.pdf
Ich werde auf meinem R7-240 etwa einen Nbody testen, der morgen 1/24 oder 1/26 Power von FP32 als FP64 ist.
Edit: es funktioniert.
__kernel void sumGPU(__global float * a,__global float * b) { int idx = get_global_id(0); float a0=a[idx]; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; //a0=convert_float(convert_double(a0)+2.0); //a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; a0+=2.0f; b[idx] = a0; }
Es wechselt zwischen 13,02 ms und 12,85 ms, wenn nur einer der Kommentare deaktiviert ist.
Hinweis: Kerne sind nicht selbst fp32. Es gibt keine Kerne. Es gibt Scheduler, die Hardwareressourcen (fp32, fp64, special_function, register) an Kernel-Anweisungen von Threads binden. Threads sind auch keine echten Threads. Wenn Sie also fp32, dann fp64, dann fp32 und dann fp64_square_root verwenden, werden die erforderlichen Ressourcen reserviert, wenn sie benötigt werden. Wenn nicht, sind sie Optionen für andere Arbeitselemente (aber ein einzelnes Arbeitselement kann nicht mehr als 1-2 fp32-ALUs verwenden, die ich vermute (idk, ich habe mir das ausgedacht)).
Edit (2018/03): Wird FP_raytrace
(der zweite Absatz dieser Antwort oben) Wirklichkeit?
(NVIDIA) https://www.geforce.com/whats-new/articles/nvidia-rtx-real-time-game-ray-tracing
(AMD) https://www.gamingonlinux.com/articles/amd- hat- radeon- rays-an- open- source- ray- tracing- sdk- using- vulkan.11461 angekündigt
Oder ist es ein weiteres Marketing-Gimmick? Wenn es eine Hardware-Seite hat, können Raytracer-Leute schneller arbeiten, aber es wäre keine Hilfe für einen Moba-Gamer oder einen Ray-Tracer-freien Physik-Simulator. Warum sollte ich für diese Raytracer mehr bezahlen, wenn ich Videos bearbeiten möchte? Vielleicht können diese auch als andere segmentiert werden, wahrscheinlich aber für mehr Geld.