Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

08.12.2015, 11:29

Ok, wenn Performance eine Rolle spielt willst du da wohl sowieso mit SSE ansetzen, womit das alles hinfällig wird. Ansonsten wohl einfach mit unsigned char Arrays und memcpy() arbeiten. Für etwas mehr Performance ist memcpy() in einen int vermutlich eine ganz gute und recht portable Lösung über deren Wohldefiniertheit man von mir aus sogar diskutieren kann. Vom union-Hack würde ich mich auf jeden Fall fern halten, der ist definitiv UB...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (08.12.2015, 11:59)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

12

08.12.2015, 11:40

Vom union-Hack würde ich mich auf jeden Fall fern halten, der ist definitiv UB...

Gleichzeitig aber auch so bekannt, dass die meisten Compiler gut damit klar kommen, soweit ich das in den Diskussionen auf SO sehe.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

08.12.2015, 11:55

Das ist schon richtig; ich persönlich bin halt kein Fan davon, mich von so Features abhängig zu machen, die lediglich supported werden, weil zuviel kaputter Code existiert, der zu funktionieren aufhören würde, wenn man es nicht mehr supported. Ein anderes Beispiel für sowas wären wohl all die magischen Garantien, die einige Compiler zu volatile Objekten machen... ;)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

08.12.2015, 20:36

memcpy wird halt meiner Erfahrung nach gelegentlich nicht wegoptimiert was in den Fällen einem Weltuntergang in Hinsicht auf Performance gleichkommt.

Die Frage ist, was sind dann die Alternativen? Und nicht immer möchte oder kann man SSE Intrinsics verwenden, die die Portabilität übrigens noch deutlich verschlechtern.

Das Verletzen von Strict Aliasing ist mit may_alias explixit erlaubt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

08.12.2015, 20:55

memcpy wird halt meiner Erfahrung nach gelegentlich nicht wegoptimiert was in den Fällen einem Weltuntergang in Hinsicht auf Performance gleichkommt.

Nun, ich brauch das fast nie, aber alle Compilern, die ich getestet hab (MSVC, gcc, clang, icc), haben mir mein memcpy() zu einem move optimiert und, zumindest so lange Quelle und Ziel sich im lokalen Scope befinden, wäre ich wirklich schwer überrascht, wenn ein Compiler das plötzlich nicht mehr machen würde...


Die Frage ist, was sind dann die Alternativen? Und nicht immer möchte oder kann man SSE Intrinsics verwenden, die die Portabilität übrigens noch deutlich verschlechtern.

Naja, wenn man Portabilität will, ist memcpy() imo die einzig akzeptable Lösung. Da es im konkreten Fall um das – vermutlich möglichst flotte – Bearbeiten eines Bitstream sowie Konvertieren zwischen half und single precision float geht, ist SSE imo schwer zu empfehlen, da das mehr Daten schaufeln kann und entsprechende Instructions hat. Zwar ist SSE natürlich Architekturspezifisch, die Intrinsics an sich aber zwischen Compilern/Plattformen portabel...


Das Verletzen von Strict Aliasing ist mit may_alias explixit erlaubt.

Naja, das ist aber sogar noch weniger portabel als so manche Intrinsics... ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

08.12.2015, 21:08

Es geht schon noch um's Lesen von Streams, ja? Ich glaube kaum, dass das *die* Stelle ist, die unbedingt hohe Performance erfordert. Egal wozu memcpy optimiert oder nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (08.12.2015, 21:17)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

17

09.12.2015, 14:43

Anstatt einfach mal die paar Zeilen zu implementieren, sollten wir aber lieber noch ein paar Seiten hier diskutieren!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

09.12.2015, 15:40

Na ja, ich finde ich durchaus sinnvoll mal drüber zu reden, ob man irgendwo undefined behaviour verbaut, speziell wenn es portabel sein soll und durch verschiedene Compiler gejagt wird. Da kommen am Ende sonst komische Dinge bei raus.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

19

09.12.2015, 15:54

Na ja, ich finde ich durchaus sinnvoll mal drüber zu reden, ob man irgendwo undefined behaviour verbaut, speziell wenn es portabel sein soll und durch verschiedene Compiler gejagt wird. Da kommen am Ende sonst komische Dinge bei raus.
Ja, darauf hatten wir uns ja wohl schon geeinigt. Jetzt sind wir an der Stelle, ob wir es standardkonform probieren oder nicht, weil sonst evtl. vlt. ja die Performance leiden koennte.

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

20

09.12.2015, 16:00

Der Thread drüben im ZFX: http://zfx.info/viewtopic.php?f=4&t=3926

Ja, das Ergebnis ist wohl: so völlig frei von Unspecified Behavior wird es gar nicht. Bisher implementiert war die Lösung über einen schlichten reinterpret_cast:

C-/C++-Quelltext

1
float f = reinterpret_cast<float&> (i);


Kompiliert und tut das Richtige auf VC und - wenn ich mich recht erinnere - auch auf CLANG. Kompiliert und tut das Richtige, aber warnt, auf GCC. Jetzt aktuell implementierte Lösung ist über union:

C-/C++-Quelltext

1
union { float f; uint32_t i; } u; u.i = some_int; float f = u.f; 


Kompiliert und tut das Richtige auf VC und GCC, CLANG kann ich gerade nicht erproben. Ist aber trotzdem UB.

Ich werde bei Gelegenheit mal Tests mit ASM-Betrachtung machen, wenn ich mal Zeit und Muße habe. Und mich dann noch daran erinnere, denn das wird sicher erst im kommenden Jahr :-)
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige