SIMD double-float Switching
Frage von Michael ( @snmihuss ):
der (bisher einzige) SIMD Datentyp ist double4_t. Eigentlich sollte doch gerade bei der Vektorisierung statt double real verwendet werden oder nicht?
real_t ist in waLBerla je nach CMake Konfiguration entweder float oder double um transparent zwischen single und double precisicion umschalten zu können. SIMD Code kann leider nicht so einfach unabhängig von float/double geschrieben werden, da sich ja dann die Vektorlänge ändert. Also double4_t entspricht float8_t.
Man kann das Problem auf mehrere Arten lösten:
- Variante 1: Nur double4_t anbieten, sehr einfach und bereits implementiert :)
- Variante 2: Variante1 plus zusätzlich den float8_t anbieten und das float-double Switching dem Sweep Programmierer überlassen
- Variante 3: Variante 2 plus real8_t implementieren der auf float8_t bzw. double8_t gemappt wird. double4_t muss aber weiterhin existieren, da manche Sweeps (Phasenfeld) von der Anwendung her mit 4er Vektoren arbeiten, und das gut auf AVX gemappt werden kann.
Bis jetzt ist wie gesagt nur Variante1 implementiert. Für LBM Sweeps kann aber durchaus Variante 3 sinnvoll sein (macht aber viel Arbeit)
@schornbaum @godenschwager was meint ihr, brauchen wir einen double8_t?
Hätte auch den Vorteil dass auf XeonPhi (AVX512) die SIMD Breite sowieso 8 doubles sind :)