Die schnellste und speichereffizienteste Lattice-Boltzmann-CFD-Software, die über OpenCL auf allen GPUs läuft. Kostenlos für nichtkommerzielle Nutzung.
(Klicken Sie auf die Bilder, um Videos auf YouTube anzuzeigen)
v1.0 (04.08.2022) Änderungen (öffentliche Veröffentlichung)
öffentliche Veröffentlichung
v1.1 (29.09.2022) Änderungen (GPU-Voxelisierung)
Solide Voxelisierung auf der GPU hinzugefügt (langsamer Algorithmus)
Werkzeug zum Ausdrucken der aktuellen Kameraposition hinzugefügt (Taste G )
Kleinere Fehlerbehebung (Problemumgehung für Intel iGPU-Treiberfehler beim Dreieck-Rendering)
v1.2 (24.10.2022) Änderungen (Kraft-/Drehmomentberechnung)
Funktionen zur Berechnung von Kraft/Drehmoment auf Objekte hinzugefügt
Funktion zum Übersetzen von Mesh hinzugefügt
Stokes-Drag-Validierungs-Setup hinzugefügt
v1.3 (10.11.2022) Änderungen (kleinere Fehlerbehebungen)
Einheitenumrechnungsfunktionen für Drehmoment hinzugefügt
FORCE_FIELD
und VOLUME_FORCE
können jetzt unabhängig voneinander verwendet werden
Kleinere Fehlerbehebung (Problemumgehung für AMD-Legacy-Treiberfehler mit binären Zahlenliteralen)
v1.4 (14.12.2022) Änderungen (Linux-Grafik)
Komplette Neufassung der C++-Grafikbibliothek, um API-Abhängigkeiten zu minimieren
Interaktiver Grafikmodus unter Linux mit X11 hinzugefügt
Fehler bei der Streamline-Visualisierung in 2D behoben
v2.0 (09.01.2023) Änderungen (Multi-GPU-Upgrade)
(herstellerübergreifende) Multi-GPU-Unterstützung auf einem einzelnen Knoten (PC/Laptop/Server) hinzugefügt
v2.1 (15.01.2023) Änderungen (schnelle Voxelisierung)
blitzschnelle solide Voxelisierung auf der GPU (neuer Algorithmus, von Minuten auf Millisekunden)
v2.2 (20.01.2023) Änderungen (Geschwindigkeitsvoxelisierung)
Option hinzugefügt, um sich bewegende/rotierende Geometrie auf der GPU zu voxelisieren, mit automatischer Geschwindigkeitsinitialisierung für jeden Gitterpunkt basierend auf dem Rotationszentrum, der linearen Geschwindigkeit und der Rotationsgeschwindigkeit
Bei Zellen, die während der Revoxelisierung von fest zu flüssig umgewandelt werden, werden die DDFs jetzt ordnungsgemäß initialisiert
Option hinzugefügt, um das Netz während read_stl(...)
nicht automatisch zu skalieren, mit negativem size
Kernel für Solid-Boundary-Rendering mit Marching-Cubes hinzugefügt
v2.3 (30.01.2023) Änderungen (Partikel)
Hinzugefügte Partikel mit Immersed-Boundary-Methode (entweder passiv oder 2-Wege-gekoppelt, nur mit Single-GPU unterstützt)
Kleinere Optimierung des GPU-Voxelisierungsalgorithmus (Arbeitsgruppen-Threads außerhalb des Mesh-Begrenzungsrahmens kehren zurück, nachdem Ray-Mesh-Schnittpunkte gefunden wurden)
Die angezeigte GPU-Speicherzuordnungsgröße ist jetzt vollständig korrekt
Fehler in der Funktion write_line()
in src/utilities.hpp
behoben
.exe
Dateierweiterung für Linux/macOS entfernt
v2.4 (11.03.2023) Änderungen (UI-Verbesserungen)
Mit der Taste H wurde ein Hilfemenü hinzugefügt, das Tastatur-/Maussteuerung, Visualisierungseinstellungen und Simulationsstatistiken anzeigt
Verbesserungen der Tastatur-/Maussteuerung ( +/- für Zoom, Mausklick gibt den Cursor frei/sperrt ihn)
Vorschlag für die größtmögliche Rasterauflösung hinzugefügt, wenn die Auflösung höher eingestellt ist, als der Speicher zulässt
kleinere Optimierungen in der Multi-GPU-Kommunikation (unwesentlicher Leistungsunterschied)
Fehler in der Temperaturgleichgewichtsfunktion für die Temperaturverlängerung behoben
Fehlerhaftes Doppelliteral für Intel iGPUs in Skybox-Farbfunktionen behoben
Fehler in make.sh behoben, bei dem Multi-GPU-Geräte-IDs nicht an die ausführbare Datei weitergeleitet wurden
Kleinere Fehlerbehebungen in der Grafik-Engine (freier Cursor nicht zentriert während der Drehung, Beschriftungen im VR-Modus)
Fehler in der Standardinitialisierung des Größenparameters LBM::voxelize_stl()
behoben
v2.5 (11.04.2023) Änderungen (Raytracing-Überarbeitung)
Lichtabsorption in Flüssigkeit für Raytracing-Grafiken implementiert (keine Auswirkungen auf die Leistung)
Verbesserte Raytracing-Framerate, wenn sich die Kamera in Flüssigkeit befindet
Die flackernden Artefakte der Skybox-Stange wurden behoben
Fehler behoben, bei dem sich bewegende Objekte während der erneuten Voxelisierung eine fehlerhafte Spur aus durchgezogenen Gitterzellen hinterließen
v2.6 (16.04.2023) Änderungen (Intel Arc-Patch)
OpenCL-Probleme von Intel Arc-GPUs behoben: Jetzt sind VRAM-Zuweisungen >4 GB möglich und die korrekte VRAM-Kapazität wird gemeldet
v2.7 (29.05.2023) Änderungen (Visualisierungs-Upgrade)
Slice-Visualisierung hinzugefügt (Taste 2 / Taste 3 Modi, dann mit Taste T durch die Slice-Modi wechseln, Slice mit den Tasten Q / E verschieben)
Flaggen-Drahtgitter-/Solid-Surface-Visualisierungskerne mit Taste 1 umschaltbar gemacht
Oberflächendruckvisualisierung hinzugefügt (Taste 1, wenn FORCE_FIELD
aktiviert ist und lbm.calculate_force_on_boundaries();
aufgerufen wird)
Binäre .vtk
Exportfunktion für Meshes mit lbm.write_mesh_to_vtk(Mesh* mesh);
time_step_multiplicator
für die Funktion integrate_particles()
in der PARTICLES-Erweiterung hinzugefügt
Die Korrektur falscher Speicherberichte auf Intel Arc wurde robuster gemacht
Fehler in den Vorlagenfunktionen write_file()
behoben
Für jedes OpenCL-Gerät wurde wieder ein separater cl::Context
verwendet, da der gemeinsame Kontext andernfalls allen anderen nicht verwendeten Nvidia-GPUs zusätzlichen VRAM zuweisen würde
Debug- und x86-Konfigurationen aus der Visual Studio-Lösungsdatei entfernt (eine Komplikation weniger beim Kompilieren)
Fehler behoben, durch den Partikel zu nahe an Wände gelangen und stecken bleiben oder die flüssige Phase verlassen konnten (Grenzkraft hinzugefügt)
v2.8 (24.06.2023) Änderungen (Dokumentation + Politur)
endlich mehr Dokumentation hinzugefügt
Alle Beispiel-Setups in setup.cpp
wurden bereinigt, um sie anfängerfreundlicher zu machen, und erforderliche Erweiterungen in defines.hpp
als Kommentare zu allen Setups hinzugefügt
Verbessertes Laden zusammengesetzter .stl
Geometrien durch Hinzufügen einer Option zum Auslassen der automatischen Neupositionierung des Netzes. Hinzugefügt wurden weitere Funktionen zur Mesh
in utilities.hpp
Funktion uint3 resolution(float3 box_aspect_ratio, uint memory)
hinzugefügt, um die Auflösung der Simulationsbox basierend auf dem Seitenverhältnis der Box und der VRAM-Belegung in MB zu berechnen
bool lbm.graphics.next_frame(...)
Funktion hinzugefügt, um Bilder für eine angegebene Videolänge in der main_setup
-Rechenschleife zu exportieren
VIS_...
Makros hinzugefügt, um das Festlegen von Visualisierungsmodi im Headless-Grafikmodus in lbm.graphics.visualization_modes
zu erleichtern
Die Abmessungen der Simulationsbox werden jetzt für Multi-GPU-Simulationen automatisch gleichmäßig durch Domänen teilbar gemacht
Die Formatierung von Info-/Warnungs-/Fehlermeldungen beim Laden von Dateien wurde korrigiert und die Beschriftungen von Info-/Warnungs-/Fehlermeldungen wurden farbig gestaltet
Ahmed-Körperaufbau als Beispiel für die Berechnung von Körperkräften und Luftwiderstandskoeffizienten hinzugefügt
Cessna 172- und Bell 222-Setups hinzugefügt, um das Laden zusammengesetzter .stl-Geometrien und die Revoxelisierung beweglicher Teile zu demonstrieren
optionaler halbtransparenter Rendering-Modus hinzugefügt ( #define GRAPHICS_TRANSPARENCY 0.7f
in defines.hpp
)
Das Flackern der Streamline-Visualisierung in interaktiven Grafiken wurde behoben
Verbesserte glatte Positionierung von Stromlinien im Slice-Modus
Fehler behoben, bei dem mass
und massex
in SURFACE
Erweiterung auch im CPU-RAM zugewiesen wurden (nicht erforderlich)
Fehler beim Q-Kriterium-Rendering von Halo-Daten im Multi-GPU-Modus behoben, Lückenbreite zwischen Domänen verringert
Die Shared-Memory-Optimierung wurde aus dem Mesh-Voxelisierungskernel entfernt, da sie auf Nvidia-GPUs mit neuen GPU-Treibern abstürzt und mit alten OpenCL 1.0-GPUs nicht kompatibel ist
Die Farbe der Raytracing-Dämpfung wurde korrigiert, wenn sich an den Wänden der Simulationsbox keine Oberfläche mit periodischen Grenzen befindet
v2.9 (31.07.2023) Änderungen (Multithreading)
Plattformübergreifende parallel_for
Implementierung in utilities.hpp
mit std::threads
hinzugefügt
Deutlich (>4x) schnellerer Simulationsstart mit Multithread-Geometrieinitialisierung und Plausibilitätsprüfungen
schnellere Funktionen calculate_force_on_object()
und calculate_torque_on_object()
mit Multithreading
Gesamtlaufzeit und LBM-Laufzeit zu lbm.write_status()
hinzugefügt
Fehler in der Richtung des Voxelisierungsstrahls beim erneuten Voxelisieren rotierender Objekte behoben
Fehler in Mesh::get_bounding_box_size()
behoben
Fehler in der Funktion print_message()
in utilities.hpp
behoben
v2.10 (05.11.2023) Änderungen (Frustrum-Keulung)
Verbesserte Rasterisierungsleistung durch Frustrum-Culling, wenn nur ein Teil der Simulationsbox sichtbar ist
Verbesserter Wechsel zwischen zentriertem und freiem Kameramodus
überarbeitete OpenCL-Rendering-Bibliothek
Einheitenumrechnungsfaktoren werden jetzt automatisch in der Konsole gedruckt, wenn units.set_m_kg_s(...)
verwendet wird
Schnellere Startzeit für den FluidX3D-Benchmark
Miner-Fehlerbehebung im voxelize_mesh(...)
-Kernel
Fehler in shading(...)
langsame (im Multithreading) std::rand()
-Funktion durch Standard-C99-LCG ersetzt
Robustere Korrektur falscher VRAM-Kapazitätsberichte auf Intel Arc-GPUs
Einige kleinere Compiler-Warnungen wurden behoben
v2.11 (07.12.2023) Änderungen (verbesserte Linux-Grafik)
Interaktive Grafiken unter Linux sind jetzt auch im Vollbildmodus verfügbar und entsprechen vollständig Windows
Die CPU-/GPU-Pufferinitialisierung wurde mit std::fill
und enqueueFillBuffer
erheblich beschleunigt (insgesamt ca. 8 % schnellerer Simulationsstart).
Informationen zum Betriebssystem zum Ausdruck der Version des OpenCL-Gerätetreibers hinzugefügt
Flackern mit Frustrum-Culling bei sehr kleinem Sichtfeld behoben
Fehler behoben, bei dem der gerenderte/exportierte Frame nicht aktualisiert wurde, wenn sich visualization_modes
änderten
v2.12 (18.01.2024) Änderungen (schnellerer Start)
~3x schnellere Quellcode-Kompilierung unter Linux mit mehreren CPU-Kernen, wenn make
installiert ist
deutlich schnellere Simulationsinitialisierung (~40 % Single-GPU, ~15 % Multi-GPU)
Kleinere Fehlerbehebung in der Funktion Memory_Container::reset()
v2.13 (11.02.2024) Änderungen (verbesserter .vtk-Export)
Daten in exportierten .vtk
Dateien werden jetzt automatisch in SI-Einheiten konvertiert
~2x schnellerer .vtk
Export mit Multithreading
Einheitenumrechnungsfunktionen für TEMPERATURE
Erweiterung hinzugefügt
Grafikartefakte mit achsenausgerichteter Kamera im Raytracing behoben
get_exe_path()
für macOS behoben
Probleme mit X11-Multimonitoren unter Linux behoben
Problemumgehung für Nvidia-Treiberfehler: enqueueFillBuffer
ist bei großen Puffern auf Nvidia-GPUs defekt
Probleme mit der langsamen numerischen Drift behoben, die durch -cl-fast-relaxed-math
verursacht wurden
Falsche Meldung der maximalen Zuordnungsgröße in LBM::write_status()
behoben
Fehlende Skalierung von Koordinaten in SI-Einheiten in LBM::write_mesh_to_vtk()
behoben
v2.14 (03.03.2024) Änderungen (Visualisierungs-Upgrade)
Die Farbgebung kann nun mit der Taste Z zwischen Geschwindigkeit/Dichte/Temperatur umgeschaltet werden
einheitliche, verbesserte Farbpaletten für die Visualisierung von Geschwindigkeit, Dichte und Temperatur
Farbskala mit automatischer Einheitenumrechnung kann jetzt mit der Taste H angezeigt werden
Der Slice-Modus für die Feldvisualisierung zeichnet jetzt vollständig ausgefüllte Slices statt nur Linien für Geschwindigkeitsvektoren
Die Schattierung in den Modi VIS_FLAG_SURFACE
und VIS_PHI_RASTERIZE
ist jetzt glatter
make.sh
erkennt jetzt automatisch Betriebssystem und X11-Unterstützung unter Linux und führt FluidX3D nur aus, wenn die letzte Kompilierung erfolgreich war
Compiler-Warnungen auf Android behoben
Fehler behoben, bei make.sh
auf einigen Systemen aufgrund eines nicht standardmäßigen Interpreterpfads fehlschlug
Es wurde behoben, dass make
auf einigen Systemen nicht mit mehreren Kernen kompiliert werden konnte
v2.15 (09.04.2024) Änderungen (Framerate-Boost)
Eine Frame-Speicherkopie und ein Clear-Frame-Vorgang in der Rendering-Kette wurden eliminiert, was zu einer um 20–70 % höheren Framerate sowohl unter Windows als auch unter Linux führt
Aktivierte g++
-Compiler-Optimierungen für schnelleren Start und höhere Rendering-Framerate
Fehler bei Multithread-Zustandsprüfungen behoben
Falsche Einheitenumrechnung für den Wärmeausdehnungskoeffizienten behoben
feste Umrechnung von Dichte in Druck in LBM-Einheiten
Fehler behoben, durch den der Raytracing-Kernel die Simulation blockieren konnte
Kleinere visuelle Artefakte beim Raytracing behoben
Es wurde behoben, dass die Konsole manchmal nicht geleert wurde, bevor INTERACTIVE_GRAPHICS_ASCII
-Rendering begann
v2.16 (02.05.2024) Änderungen (Fehlerbehebungen)
Vereinfachte 10 % schnellere Marching-Cubes-Implementierung mit 1D-Interpolation an Kanten anstelle von 3D-Interpolation, wodurch die Kantentabelle entfällt
Schnellere, vereinfachte Marching-Cubes-Variante für Solid-Surface-Rendering hinzugefügt, bei der Kanten immer auf halbem Weg zwischen Gitterzellen liegen
Refactoring in OpenCL-Rendering-Kerneln
Es wurde behoben, dass die Voxelisierung in der Intel OpenCL CPU Runtime aufgrund eines Array-Zugriffs außerhalb der Grenzen fehlschlug
Es wurde behoben, dass die Voxelisierung bei Multi-GPU im Vergleich zu Single-GPU nicht immer binär identische Ergebnisse lieferte
Es wurde behoben, dass die Geschwindigkeitsvoxelisierung bei Simulationen freier Oberflächen fehlschlug
Die schreckliche Leistung auf ARM-GPUs wurde behoben, indem Fused-multiply-add ( fma
) durch ein Makro durch a*b+c
ersetzt wurde
Es wurde behoben, dass die Y / Z -Tasten für QWERTY
Tastaturlayout unter Linux falsch waren
Es wurde behoben, dass die Bewegungsgeschwindigkeit der freien Kamera im Hilfe-Overlay im Standbild beim Scrollen nicht aktualisiert wurde
Es wurde behoben, dass der Cursor beim Scrollen auf Trackpads mit interaktiven Linux-X11-Grafiken manchmal flackerte
Das Flackern des interaktiven Renderings mit Multi-GPU, wenn die Kamera nicht bewegt wird, wurde behoben
Fehlender XInitThreads()
-Aufruf behoben, der auf einigen Systemen zum Absturz interaktiver Linux-Grafiken führen konnte
Z-Kampf zwischen den Kerneln graphics_rasterize_phi()
und graphics_flags_mc()
behoben
v2.17 (05.06.2024) Änderungen (unbegrenzte Domänenauflösung)
Domains sind nicht mehr auf 4,29 Milliarden (2³², 1624³) Rasterzellen oder 225 GB Speicher beschränkt; Wenn mehr verwendet werden, wird der OpenCL-Code automatisch mit 64-Bit-Indizierung kompiliert
neue, schnellere Raytracing-basierte Feldvisualisierung für Single-GPU-Simulationen
Installationsanweisungen für GPU-Treiber und OpenCL Runtime zur Dokumentation hinzugefügt
INTERACTIVE_GRAPHICS_ASCII
überarbeitet
Speicherleck in Destruktoren von floatN
, floatNxN
, doubleN
, doubleNxN
behoben (alle ungenutzt)
Das Verhalten der Kamerabewegung/-drehung/-zoom wurde unabhängig von der Bildrate gemacht
Es wurde behoben, dass smart_device_selection()
eine falsche Warnung ausgab, wenn das Gerät eine Taktrate von 0 MHz meldete
v2.18 (21.07.2024) Änderungen (weitere Fehlerbehebungen)
Unterstützung für Monitore mit hoher Bildwiederholfrequenz unter Linux hinzugefügt
Kompaktere OpenCL Runtime-Installationsskripte in der Dokumentation
Anweisungen zur Treiber-/Laufzeitinstallation werden jetzt auf der Konsole gedruckt, wenn keine OpenCL-Geräte verfügbar sind
Domäneninformationen zu LBM::write_status()
hinzugefügt
LBM::index
Funktion für uint3
Eingabeparameter hinzugefügt
Es wurde behoben, dass sehr große Simulationen manchmal nicht richtig gerendert wurden, wenn die maximale Renderentfernung von 10 K auf 2,1 M erhöht wurde
Das Stottern der Mauseingabe bei hoher Bildschirmaktualisierungsrate unter Linux wurde behoben
Grafikartefakte beim Free-Surface-Raytracing auf Intel CPU Runtime für OpenCL behoben
In der Konsole gedruckte Laufzeitschätzung für Setups mit mehreren lbm.run(...)
-Aufrufen korrigiert
Feste Dichteschwankungen in Probenaufbauten (zu großes lbm_u
)
Kleinere grafische Artefakte in raytrace_phi()
behoben
Kleinere grafische Artefakte in ray_grid_traverse_sum()
behoben
Fehler bei der Anzahl der gedruckten Zeitschritte bei der Regentropfen-Probeneinrichtung behoben
v2.19 (07.09.2024) Änderungen (Kamera-Splines)
Die Kamera kann jetzt mithilfe von Catmull-Rom-Splines auf einem glatten Pfad durch eine Liste bereitgestellter Keyframe-Kamerapositionen fliegen
Genauere Schätzung der verbleibenden Laufzeit, einschließlich der für das Rendern aufgewendeten Zeit
Die FP16S-Speicherkomprimierung ist standardmäßig aktiviert
Die gedruckte Kameraplatzierung mit der Taste G ist jetzt zum einfacheren Kopieren/Einfügen formatiert
Benchmark-Diagramm in Readme mit Meerjungfrau-Gantt-Diagramm hinzugefügt
Informationen zur Speicherzuordnung wurden während des Simulationsstarts an einer besseren Stelle platziert
Threading-Konflikt zwischen INTERACTIVE_GRAPHICS
und lbm.graphics.write_frame();
Die maximale Pufferzuteilungsgrößenbeschränkung für AMD-GPUs und in Intel CPU Runtime für OpenCL wurde behoben
Falscher Re<Re_max
Infoausdruck für 2D-Simulationen behoben
Kleinere Korrektur in bandwidth_bytes_per_cell_device()
Lesen Sie die FluidX3D-Dokumentation!
Streaming (Teil 2/2)
f 0 temp ( x , t ) = f 0 ( x , t )
f i temp ( x , t ) = f ( t %2 ? i : ( i %2 ? i +1 : i -1)) ( i %2 ? x : x - e i , t ) für i ∈ [1 , q -1]
Kollision
ρ ( x , t ) = (Σ i f i temp ( x , t )) + 1
u ( x , t ) = 1 ∕ ρ ( x , t ) Σ i c i f i temp ( x , t )
f i eq-shifted ( x , t ) = w i ρ · ( ( u ° c i ) 2 ∕ (2 c 4 ) - ( u ° u ) ∕ (2c 2 ) + ( u ° c i ) ∕ c 2 ) + w i ( ρ -1)
f i temp ( x , t +Δ t ) = f i temp ( x , t ) + Ω i ( f i temp ( x , t ), f i eq-shifted ( x , t ), τ )
Streaming (Teil 1/2)
f 0 ( x , t +Δ t ) = f 0 temp ( x , t +Δ t )
f ( t %2 ? ( i %2 ? i +1 : i -1) : i ) ( i %2 ? x + e i : x , t +Δ t ) = f i temp ( x , t +Δ t ) für i ∈ [1, q -1]
Variable | SI-Einheiten | Gleichung definieren | Beschreibung |
---|---|---|---|
X | M | x = (x,y,z) T | 3D-Position in kartesischen Koordinaten |
T | S | - | Zeit |
ρ | kg ∕ m³ | ρ = (Σ i f i )+1 | Massendichte einer Flüssigkeit |
P | kg ∕ m·s² | p = c ² ρ | Druck der Flüssigkeit |
u | m ∕ s | u = 1 ∕ ρ Σ i c i f i | Geschwindigkeit der Flüssigkeit |
ν | m² ∕ s | ν = μ ∕ ρ | kinematische Scherviskosität einer Flüssigkeit |
μ | kg ∕ m s | μ = ρ ν | dynamische Viskosität einer Flüssigkeit |
f i | kg ∕ m³ | - | verschobene Dichteverteilungsfunktionen (DDFs) |
Δ x | M | Δ x = 1 | Gitterkonstante (in LBM-Einheiten) |
Δt | S | Δt = 1 | Simulationszeitschritt (in LBM-Einheiten) |
C | m ∕ s | c = 1 ∕ √3 Δ x ∕ Δ t | Gittergeschwindigkeit des Schalls (in LBM-Einheiten) |
ich | 1 | 0 ≤ i < q | LBM-Streaming-Richtungsindex |
Q | 1 | q ∈ { 9,15,19,27 } | Anzahl der LBM-Streaming-Richtungen |
e i | M | D2Q9 / D3Q15/19/27 | LBM-Streaming-Anweisungen |
c ich | m ∕ s | c i = e i ∕ Δ t | LBM-Streaminggeschwindigkeiten |
w ich | 1 | Σ i w i = 1 | LBM-Geschwindigkeitssatzgewichte |
Ω i | kg ∕ m³ | SRT oder TRT | LBM-Kollisionsoperator |
τ | S | τ = ν ∕ c² + Δ t ∕ 2 | LBM-Entspannungszeit |
Geschwindigkeitssätze: D2Q9, D3Q15, D3Q19 (Standard), D3Q27
Kollisionsoperatoren: Einzelrelaxationszeit (SRT/BGK) (Standard), Zweirelaxationszeit (TRT)
DDF-Verschiebung und andere algebraische Optimierung zur Minimierung von Rundungsfehlern
????????????????????????????????????????????????? ?????
(Dichte ?, Geschwindigkeit ?, Flags ?, DDFs ?; jedes Quadrat = 1 Byte)
ermöglicht 19 Millionen Zellen pro 1 GB VRAM
In-Place-Streaming mit Esoteric-Pull: eliminiert redundante Kopien von Dichteverteilungsfunktionen (DDFs) im Speicher; Reduziert den Speicherbedarf fast um die Hälfte und steigert die Leistung aufgrund impliziter Bounce-Back-Grenzen leicht; bietet optimale Speicherzugriffsmuster für Single-Cell-In-Place-Streaming
Entkoppelte arithmetische Präzision (FP32) und Speichergenauigkeit (FP32 oder FP16S oder FP16C): Die gesamte Arithmetik erfolgt aus Kompatibilitätsgründen auf der gesamten Hardware in FP32, aber DDFs im Speicher können auf FP16S oder FP16C komprimiert werden: Halbiert den Speicherbedarf fast noch einmal und fast verdoppelt die Leistung, ohne die Gesamtgenauigkeit bei den meisten Setups zu beeinträchtigen
TYPE_S
(stationäre oder bewegliche) feste Grenzen
TYPE_E
Gleichgewichtsgrenzen (Zufluss/Abfluss)
TYPE_T
Temperaturgrenzen
TYPE_F
freie Oberfläche (flüssig)
TYPE_I
freie Oberfläche (Schnittstelle)
TYPE_G
freie Oberfläche (Gas)
TYPE_X
bleibt für benutzerdefinierte Verwendung oder weitere Erweiterungen übrig
TYPE_Y
bleibt für benutzerdefinierte Verwendung oder weitere Erweiterungen übrig
(Dichte ?, Geschwindigkeit ?, Flags ?, 2 Kopien von DDFs ?/?; jedes Quadrat = 1 Byte)
ermöglicht 3 Millionen Zellen pro 1 GB VRAM
Herkömmliches LBM (D3Q19) mit FP64 erfordert ~344 Bytes/Zelle
FluidX3D (D3Q19) benötigt mit Esoteric-Pull+FP16 nur 55 Bytes/Zelle
Große Kosteneinsparung: Vergleich der maximalen Einzel-GPU-Rasterauflösung für D3Q19 LBM
GPU-VRAM-Kapazität | 1 GB | 2 GB | 3 GB | 4 GB | 6 GB | 8 GB | 10 GB | 11 GB | 12 GB | 16 GB | 20 GB | 24 GB | 32 GB | 40 GB | 48 GB | 64 GB | 80 GB | 94 GB | 128 GB | 192 GB | 256 GB |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ungefährer GPU-Preis | 25 $ GT 210 | 25 $ GTX 950 | 12 $ GTX 1060 | 50 $ GT 730 | 35 $ GTX 1060 | 70 $ RX 470 | 500 $ RTX 3080 | 240 $ GTX 1080 Ti | 75 $ Tesla M40 | 75 $ Instinkt MI25 | 900 $ RX 7900 XT | 205 $ Tesla P40 | 600 $ Instinkt MI60 | 5500 $ A100 | 2400 $ RTX 8000 | 10.000 $ Instinkt MI210 | 11.000 $ A100 | >40.000 $ H100 NVL | ? GPU Max 1550 | ~10.000 $ MI300X | - |
traditionelles LBM (FP64) | 144³ | 182³ | 208³ | 230³ | 262³ | 288³ | 312³ | 322³ | 330³ | 364³ | 392³ | 418³ | 460³ | 494³ | 526³ | 578³ | 624³ | 658³ | 730³ | 836³ | 920³ |
FluidX3D (FP32/FP32) | 224³ | 282³ | 322³ | 354³ | 406³ | 448³ | 482³ | 498³ | 512³ | 564³ | 608³ | 646³ | 710³ | 766³ | 814³ | 896³ | 966³ | 1018³ | 1130³ | 1292³ | 1422³ |
FluidX3D (FP32/FP16) | 266³ | 336³ | 384³ | 424³ | 484³ | 534³ | 574³ | 594³ | 610³ | 672³ | 724³ | 770³ | 848³ | 912³ | 970³ | 1068³ | 1150³ | 1214³ | 1346³ | 1540³ | 1624³ |
Die Domänenzerlegung ermöglicht die Bündelung von VRAM von mehreren GPUs für eine viel größere Rasterauflösung
GPUs müssen nicht identisch sein (nicht einmal vom selben Hersteller), es wird jedoch eine ähnliche VRAM-Kapazität/Bandbreite empfohlen
Domänenkommunikationsarchitektur (vereinfacht)
++ .-------------------------------- -------------------. ++++ | GPU 0 | ++++ | LBM-Domäne 0 | ++++ '--------------------------------------------- --------------------' ++++ | selektiv /| ++++ |/ In-VRAM-Kopie | ++++ .---------------- ----------. ++++ | GPU 0 – Übertragungspuffer 0 | ++++ '-------------------------------------------- ----------' ++!! | PCIe /| !!!! |/ kopieren | !!@@ .----------. .-----------. @@@@ | CPU - Übertragungspuffer 0 | | CPU - Transferpuffer 1 | @@@@ '-----------' /'----------------- --------' @@@@ Zeiger X swap @@@@ .-------------------------./ .- ------------------------. @@@@ | CPU - Transferpuffer 1 | | CPU - Übertragungspuffer 0 | @@@@ '-------------------------' '------------------ -------' @@!! /| PCIe | !!!! | kopieren |/ !!++ .------------- -------------. ++++ | GPU 1 – Übertragungspuffer 1 | ++++ '--------------------------------------------- ----------' ++++ /| selektiv | ++++ | In-VRAM-Kopie |/ ++++ .------------------------ ------------. ++++ | GPU 1 | ++++ | LBM-Domäne 1 | ++++ '-------------------------------------------- --------------------' ++## | #### Domänensynchronisierungsbarriere #### | ##|| -------------------------------------------------- -----------> Zeit ||
Domänenkommunikationsarchitektur (detailliert)
++ .-------------------------------- -------------------. ++++ | GPU 0 | ++++ | LBM-Domäne 0 | ++++ '-------------------------------------------- --------------------' ++++ | selektiv in- /| | selektiv in- /| | selektiv in- /| ++++ |/ VRAM-Kopie (X) | |/ VRAM-Kopie (Y) | |/ VRAM-Kopie (Z) | ++++ .-------.--------.- --------------------. ++++ | GPU 0 - TB 0X+ | GPU 0 – TB 0Y+ | GPU 0 - TB 0Z+ | ++++ | GPU 0 - TB 0X- | GPU 0 - TB 0Y- | GPU 0 - TB 0Z- | ++++ '---------------------'-------'- --------------------' ++!! | PCIe /| | PCIe /| | PCIe /| !!!! |/ kopieren | |/ kopieren | |/ kopieren | !!@@ .---------. .---------.---------. .---------.---------. .---------. @@@@ | CPU 0X+ | | CPU 1X- | CPU 0Y+ | | CPU 3J- | CPU 0Z+ | | CPU 5Z- | @@@@ | CPU 0X- | | CPU 2X+ | CPU 0Y- | | CPU 4J+ | CPU 0Z- | | CPU 6Z+ | @@@@ '--------- /---------'--------- /---------'----- ---- /---------' @@@@ Zeiger X-Swap (X) Zeiger X-Swap (Y) Zeiger X-Swap (Z) @@@@ .-------- -/ ---------.---------/ ---------.---------/ ---------. @@@@ | CPU 1X- | | CPU 0X+ | CPU 3J- | | CPU 0Y+ | CPU 5Z- | | CPU 0Z+ | @@@@ | CPU 2X+ | | CPU 0X- | CPU 4J+ | | CPU 0Y- | CPU 6Z+ | | CPU 0Z- | @@@@ '---------' '---------'---------' '---------'--- ------' '---------' @@!! /| PCIe | /| PCIe | /| PCIe | !!!! | kopieren |/ | kopieren |/ | kopieren |/ !!++ .------..------------------- -..--------------------. ++++ | GPU 1 - TB 1X- || GPU 3 - TB 3Y- || GPU 5 - TB 5Z- | ++++ :====================::====================:: ====================: ++++ | GPU 2 – TB 2X+ || GPU 4 – TB 4J+ || GPU 6 - TB 6Z+ | ++++ '--------------------''-------'' --------------------' ++++ /| selektiv in- | /| selektiv in- | /| selektiv in- | ++++ | VRAM-Kopie (X) |/ | VRAM-Kopie (Y) |/ | VRAM-Kopie (Z) |/ ++++ .-------------------..---------------- -----..------. ++++ | GPU 1 || GPU 3 || GPU 5 | ++++ | LBM-Domäne 1 || LBM-Domäne 3 || LBM-Domäne 5 | ++++ :====================::====================:: ====================: ++++ | GPU 2 || GPU 4 || GPU 6 | ++++ | LBM-Domäne 2 || LBM-Domäne 4 || LBM-Domäne 6 | ++++ '--------------------''-------'' --------------------' ++## | | | #### | Barrieren bei der Domänensynchronisierung | #### | | | ##|| -------------------------------------------------- -----------> Zeit ||
Single-GPU/CPU-Benchmarks
Multi-GPU-Benchmarks
D3Q7-Unternetz für thermische DDFs
In-Place-Streaming mit Esoteric-Pull für thermische DDFs
optionale FP16S- oder FP16C-Komprimierung für thermische DDFs mit DDF-Shifting
Volumenmodell
Vollständig analytischer PLIC für eine effiziente Krümmungsberechnung
verbesserte Massenerhaltung
Ultraeffiziente Implementierung mit nur 4 Kerneln zusätzlich zum stream_collide()
-Kernel
optionale Berechnung der Kräfte der Flüssigkeit auf Festkörpergrenzen
stationäre Bounce-Back-Grenzen in der Mitte des Gitters (stationäre feste Grenzen)
Verschieben der Bounce-Back-Grenzen in der Mitte des Gitters (Verschieben fester Grenzen)
Gleichgewichtsgrenzen (nicht reflektierender Zu-/Abfluss)
Temperaturgrenzen (feste Temperatur)
Grenztypen
globale Kraft pro Volumen (Guo-Forcing), kann im laufenden Betrieb geändert werden
lokale Kraft pro Volumen (Kraftfeld)
Modernste Free-Surface-LBM-Implementierung (FSLBM):
thermisches LBM zur Simulation thermischer Konvektion
Smagorinsky-Lilly-Untergitter-Turbulenz-LES-Modell, um Simulationen mit sehr großen Reynolds-Zahlen stabil zu halten
Π αβ = Σ i e iα e iβ ( f i - f i eq-shifted )
Q = Σ αβ Π αβ 2
______________________
τ = ½ (τ 0 + √ τ 0 2 + (16√2) ∕ ( 3π 2 ) √Q ∕ ρ )
Partikel mit Immersed-Boundary-Methode (entweder passiv oder 2-Wege-gekoppelt, nur Einzel-GPU)
FluidX3D kann Simulationen durchführen, die so groß sind, dass das Speichern der volumetrischen Daten für das spätere Rendern nicht mehr zu bewältigen ist (z. B. 120 GB für einen einzelnen Frame, Hunderte von TeraByte für ein Video).
Stattdessen ermöglicht FluidX3D das Rendern von Rohsimulationsdaten direkt im VRAM, sodass keine großen volumetrischen Dateien auf die Festplatte exportiert werden müssen (siehe meinen technischen Vortrag).
Das Rendering ist so schnell, dass es sowohl für die Rasterung als auch für das Raytracing interaktiv in Echtzeit funktioniert
Rasterisierung und Raytracing werden in OpenCL durchgeführt und funktionieren auf allen GPUs, auch auf solchen ohne RTX/DXR-Raytracing-Kerne oder ohne jegliche Rendering-Hardware (wie A100, MI200, ...)
Wenn kein Monitor verfügbar ist (z. B. auf einem Remote-Linux-Server), gibt es einen ASCII-Rendering-Modus zur interaktiven Visualisierung der Simulation im Terminal (auch in WSL und/oder über SSH).
Das Rendering erfolgt vollständig multi-GPU-parallelisiert über eine nahtlose Domänenzerlegungs-Rasterisierung
Wenn der interaktive Grafikmodus deaktiviert ist, kann die Bildauflösung so groß sein, wie es der VRAM zulässt (4K/8K/16K und höher).
(interaktive) Visualisierungsmodi:
Flag-Drahtmodell/Festkörperoberfläche (und Kraftvektoren auf Festkörperzellen oder Oberflächendruck, wenn die Erweiterung verwendet wird)
Geschwindigkeitsfeld (mit Slice-Modus)
Stromlinien (mit Slice-Modus)
Geschwindigkeitsgefärbte Q-Kriterium-Isofläche
gerasterte Freifläche mit Marschwürfeln
Raytracing-freie Oberfläche mit schneller Ray-Grid-Durchquerung und Marching-Cubes, entweder 1-4 Strahlen/Pixel oder 1-10 Strahlen/Pixel
FluidX3D ist in OpenCL 1.2 geschrieben und läuft daher auf jeder Hardware aller Hersteller (Nvidia, AMD, Intel, ...):
Die schnellsten Rechenzentrums-GPUs der Welt: MI300X, H100 (NVL), A100, MI200, MI100, V100(S), GPU Max 1100, ...
Gaming-GPUs (Desktop/Laptop): Nvidia GeForce, AMD Radeon, Intel Arc
Profi-/Workstation-GPUs: Nvidia Quadro, AMD Radeon Pro / FirePro, Intel Arc Pro
integrierte GPUs
CPUs (erfordert die Installation von Intel CPU Runtime für OpenCL)
Intel Xeon Phi (erfordert die Installation von Intel CPU Runtime für OpenCL)
Smartphone-ARM-GPUs
native herstellerübergreifende Multi-GPU-Implementierung
nutzt PCIe-Kommunikation, daher ist kein SLI/Crossfire/NVLink/InfinityFabric erforderlich
Single-Node-Parallelisierung, daher ist keine MPI-Installation erforderlich
GPUs müssen nicht einmal vom selben Hersteller sein, es wird jedoch eine ähnliche Speicherkapazität und Bandbreite empfohlen
Funktioniert unter Windows und Linux mit C++17, mit eingeschränkter Unterstützung auch für macOS und Android
Unterstützt den Import und die Voxelisierung von Dreiecksnetzen aus binären .stl
Dateien mit schneller GPU-Voxelisierung
unterstützt den Export volumetrischer Daten als binäre .vtk
Dateien
unterstützt den Export von Dreiecksnetzen als binäre .vtk
Dateien
unterstützt den Export gerenderter Bilder als .png
/ .qoi
/ .bmp
Dateien; Die Kodierung läuft parallel auf der CPU, während die Simulation auf der GPU ohne Verzögerung weiterlaufen kann
Hier finden Sie Leistungsbenchmarks für verschiedene Hardware in MLUPs/s oder wie viele Millionen Gitterzellen pro Sekunde aktualisiert werden. Die für den Benchmark verwendeten Einstellungen sind D3Q19 SRT ohne aktivierte Erweiterungen (nur LBM mit impliziten Bounce-Back-Grenzen in der Mitte des Rasters) und das Setup besteht aus einer leeren kubischen Box mit ausreichender Größe (typischerweise 256³). Ohne Erweiterungen erfordert eine einzelne Gitterzelle:
eine Speicherkapazität von 93 (FP32/FP32) bzw. 55 (FP32/FP16) Bytes
eine Speicherbandbreite von 153 (FP32/FP32) bzw. 77 (FP32/FP16) Bytes pro Zeitschritt
363 (FP32/FP32) oder 406 (FP32/FP16S) oder 1275 (FP32/FP16C) FLOPs pro Zeitschritt (FP32+INT32-Operationen zusammen gezählt)
Folglich beträgt die arithmetische Intensität dieser Implementierung 2,37 (FP32/FP32) bzw. 5,27 (FP32/FP16S) bzw. 16,56 (FP32/FP16C) FLOPs/Byte. Die Leistung wird also nur durch die Speicherbandbreite begrenzt. Die Tabelle in den linken drei Spalten zeigt die Hardware-Spezifikationen, wie sie in den Datenblättern zu finden sind (theoretische Spitzenleistung der FP32-Rechenleistung, Speicherkapazität, theoretische Spitzenspeicherbandbreite). Die rechten 3 Spalten zeigen die gemessene FluidX3D-Leistung für FP32/FP32, FP32/FP16S, FP32/FP16C Gleitkomma-Präzisionseinstellungen, wobei die (Roofline-Modell-Effizienz) in runden Klammern angibt, wie viel % der theoretischen Spitzenspeicherbandbreite genutzt werden .
Wenn Ihre GPU/CPU noch nicht auf der Liste steht, können Sie Ihre Benchmarks hier melden.