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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

14.11.2013, 23:04

Größe von "Boolean" auf der GPU

Ich bin heute auf ein sehr interessantes Problem gestoßen. So wie es aussieht ist für die CPU eine booleasche Variable 1 Byte groß, während auf der GPU eine booleasche Variable 4 Byte groß zu sein scheint. Das hat mir heute viele Probleme bezüglich ConstantBuffer gebracht. Was ist die beste Lösung, booleasche Werte an die GPU zu senden? Float wäre ja Verschwendung auf der CPU.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (14.11.2013, 23:43)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

15.11.2013, 00:18

Ich bin heute auf ein sehr interessantes Problem gestoßen. So wie es aussieht ist für die CPU eine booleasche Variable 1 Byte groß

Das ist in C++ nicht definiert und hängt vom Compiler ab. Die meisten nehmen 1 Byte, weil es ein guter Kompromiss ist zwischen Platzverbrauch und Einfachheit des Zugriffs. Manche nehmen 4. Theoretisch könnte ein Compiler aber auch einen 27 Byte großen Boolean verwenden, das wäre immer noch standardkonform ;)

Was ist die beste Lösung, booleasche Werte an die GPU zu senden? Float wäre ja Verschwendung auf der CPU.

Einzelne Werte oder viele? Wenn viele, dann pack sie alle in einen int (1 Bit pro bool).
Wenn nur einzelne Werte, hast du wohl keine andere Wahl.

PS: Es heißt boolesch, nicht booleasch. Der Kerl hieß Boole.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

15.11.2013, 10:22

Okay danke!
Womit sich mir einen weitere Frage stellt: Wie kann ich den Compiler dazu zwingen, dass z.B. eine Variable vom Typ INT _immer_ 4 Byte groß ist?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

15.11.2013, 10:27

Schau dir mal den Header <cstdint> an... ;)

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

5

15.11.2013, 10:54

Wie sieht es mit andere Datentypen aus? Short, float, double, ...? Laut dem Standard müssen alle Typen nur so groß oder größer als X Byte sein.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

15.11.2013, 10:57

short ist auch ein integer Typ. Für float und double gibt es im Rahmen von Standard C++ keinerlei Garantien. Man kann in der Praxis aber wohl mit großer Sicherheit davon ausgehen, dass es sich bei float um single precision (32 Bit) und bei double um double precision (64 Bit) IEEE 754 Zahlen handelt...

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

7

15.11.2013, 13:03

Überleg dir lieber, was du am Ende mit deinen Bool'schen Werten machen willst. Willst du Werte selektieren? Muss true aufgrund irgendeines Hacks 1 sein? Nehmen wir mal zwei Beispiele aus der Welt der alten 8086-Mühlen. Nehmen wir an, dass du einen Algorithmus haben willst, der sich aus einem Bild alle Pixel anschaut, mit einer "Vorher"-Farbe vergleicht, und jedes Aufkommen der "Vorher"-Farbe durch die "Nachher"-Farbe ersetzt. Dein Code sieht dann in etwa so aus, wenn du SIMD verwendest:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// stuff...
_current = _mm256_add_epi32( // _current => aktuelle 8 Pixel
  _current,
  _mm256_and_si256(
    _diff, // __m256i{_after.RGBA - _before.RGBA}
    _mm256_cmpeq_epi32(_cmp,_current) // _cmp => __m256i{_before.RGBA}
  ) // diff*(pixel==before)
); // pixel += diff*(pixel==before)
// ...
Hier liefert das Ergebnis von Vergleichen mit SSE/AVX (hier _mm256_cmpeq_si256()) immer 0 oder -1 pro SIMD-Zelle. Dadurch erspart man sich eine zeitaufwändige Multiplikation und erledigt den ganzen Salat einfach mit einer Bitweise-Und-Verknüpfung.

C-/C++-Quelltext

1
inline int branchfree_min(int a, int b) noexcept {return b^((a^b)&-(a<b));}
Dieser kleine Hack hier, der ohne bedingte und unbedingte Sprünge das Minimum zweier Zahlen liefert, vertraut wiederum darauf, dass true zu 1 evaluiert. (Gut, dreht das ganze dann zu -1 um, aber pff...)

Worauf ich damit hinaus wollte ist, dass abhängig davon, was du für Algorithmen durch die GPU jagen willst, es vielleicht sinnvoll wäre einen neuen Typen GPU_bool zu definieren, der sich fix zu und von bool casten lässt.

Allerdings musst du schon ganz schön Ärger mit Größe usw. haben, dass solche Überlegungen/Hacks es wert sind, in Erwägung gezogen zu werden. D:

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Evrey« (15.11.2013, 13:13)


FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

16.11.2013, 01:20

Muss true aufgrund irgendeines Hacks 1 sein?

Was meinst du?

Worauf ich damit hinaus wollte ist, dass abhängig davon, was du für Algorithmen durch die GPU jagen willst, es vielleicht sinnvoll wäre einen neuen Typen GPU_bool zu definieren, der sich fix zu und von bool casten lässt.

Ich brauche meine bool's nur für Verzweigungen.

Mein Lösung ist folgende: Einfach ein int nehmen statt bool. Ich habe als erstes probiert mit Bitshifting mehrere bool's in ein Int zu packen. Auf der GPU das ganz wieder zu entflechten, erschien mir aber als zu viel Aufwand bzw. als zu viel Rechenzeitverschwendung.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige