Supercomputer
Experte
Thread Starter
- Mitglied seit
- 16.10.2014
- Beiträge
- 37
Guten Abend,
da ich nun seit diesem Semester Elektrotechnik / Informatik studiere,
ist meine Leidenschaft zum Programmieren wieder vollkommen entfacht.
Doch leider wird im Studium nicht sehr viel aktiv Programmiert, es gibt zwar die Übungen,
doch meine Kenntnisse überschreiten den aktuellen Stand bei weitem,
daher ist dies nicht wirklich befriedigend und ich suche mir nun eine fordernde Aufgabe,
an der ich mich in den nächsten Jahren gütlich tun kann.
Nun ist mir die Idee gekommen auf Parallelisierung zu gehen, sprich Multithreading und GPU Computing.
Das ganze in einem Projekt, damit ich ausgiebig: üben, scheitern, lernen und die neu erworbenen Kenntnisse vertiefen kann.
Die Idee, für ein solche Projekt wäre, eine Art "refresh" vom klassischen "Supreme Commander Forge Alliance" zu schreiben.
(Natürlich kein stumpfer Klon, sonder auch mit eigenen Ideen...)
Und so ein SC ähnliches Spiel auf den aktuellen Stand der Technik zu bringen, da SC bei einer gewissen Einheiten stärke sehr träge wird.
Geplant habe ich für dieses Projekt die Zeit neben dem Studium, also etwa 5 Jahre.
Die Sprache meiner Wahl ist C++, da ich mit dieser bereits mehr als drei Jahre Erfahrung habe.
Mir ist dabei durchaus bewusst, da 3 Jahre nicht ausreichen, um wirklich gut zu werden, doch ohne Herausforderungen kann man nicht wachsen.
Die Hauptfrage, die ich mir aktuell stelle ist, wie verhält es sich wenn ich die Einheiten nicht seriell über die CPU, sondern
parallel über die GPU berechnen lasse, da ich mir so gerade bei größeren Einheiten zahlen durch die massive Parallelisierung,
im Vergleich zum rechnen über die CPU starke Performancegewinne erhoffe.
Nun zum Grundlegenden:
Für die CPU habe ich folgende Threadeinteilung (theoretisch geplant), falls davon etwas sinnlos ist,
scheut euch nicht davor Verbesserungsvorschlägen zu kommentieren.
Die Truppenzahl wird dann wie folgt theoretisch beschränkt werden:
Wie ihr merkt, noch alles sehr theoretisch, da ich bisher nur mit einem Thread gearbeitet habe.
Daher habe ich nun folgende Fragen, die hoffentlich alle beantwortet werden können.
Wie stark beansprucht es die Karte, wenn ich z.B. CUDA Kerne bis zum Anschlag belaste?
Können dann überhaupt noch die Berechnungen für die Bildschirmausgabe ausgeführt werden?
Oder Hocken die Rechenkerne in einer Pipe und blockieren so diese Möglichkeit,
der gleichzeitigen Berechnung und Ausgabe auf dem Bildschirm?
Sollte das der Fall sein, ist es dann Besser, zwar alle Berechnungen der Truppenbewegungen mit voller Kapazität,
jedoch abwechselnd zur Grafikberechnung aus zu führen, oder lieber nicht alle Truppenbewegungen gleichzeitig zu erledigen?
Sprich einen Teil der Grafikleistung für die Truppenberechnung, den andere für die Darstellung zu nutzen.
Dann stellt sich mir noch die Frage nach der API (CUDA, OpenCL, Vulkan o.ä.)
Ich vermute mal, dass CUDA auf NVidiakarten schneller als OpenCL und Vulkan auf AMDkarten schneller als OpenCL laufen wird, oder?
Macht es dann Sinn, während der Installation/Laufzeit zu prüfen,
welche Grafikkarte verbaut ist und dann den entsprechend optimierten Code zu nutzen?
Zur Bildausgabe werde ich auf OpenGL setzten, da ich hauptsächlich Linux nutze und dieses Spiel primär für diese Plattform entwickeln möchte.
Zumal der Socket unter Linux deutlich einfacher zu Coden ist, als unter Windows
Bitte jetzt nicht direkt damit ankommen, "Du hast keine Ahnung wie Komplex das Thema ist" o.ä., ja es ist eine Herausforderung,
mir ist klar, dass Heutzutage Teams mit einigen Mitbarteitern an solchen Aufgaben programmieren und mir ist auch klar,
dass das eine Menge an Zeit brauchen wird, bis ich etwas einiger maßen performantes auf die Beine gestellt bekomme.
Doch in meinen Augen, ist genau diese Herausforderung und das tiefer gehende Verständnis in diesem Bereich all dies Wert.
Auch wenn ich an meine Grenzen stoßen werde, so bin ich zuversichtlich diese überschreiten zu können, ohne an den Hürden zu scheitern.
Ich hoffe auf eine schöne Zeit, mit interessanten Diskussionen und einem unentwegtem Wissensaustausch.
Ups
, der Post ist jetzt doch schon etwas länger geworden, als geplant 
Ich bedanke mich dann bereits an dieser Stelle dafür, dass ihr euch all das durchgelesen habt.
Mit freundlichen Grüßen
Supercomputer
da ich nun seit diesem Semester Elektrotechnik / Informatik studiere,
ist meine Leidenschaft zum Programmieren wieder vollkommen entfacht.
Doch leider wird im Studium nicht sehr viel aktiv Programmiert, es gibt zwar die Übungen,
doch meine Kenntnisse überschreiten den aktuellen Stand bei weitem,
daher ist dies nicht wirklich befriedigend und ich suche mir nun eine fordernde Aufgabe,
an der ich mich in den nächsten Jahren gütlich tun kann.
Nun ist mir die Idee gekommen auf Parallelisierung zu gehen, sprich Multithreading und GPU Computing.
Das ganze in einem Projekt, damit ich ausgiebig: üben, scheitern, lernen und die neu erworbenen Kenntnisse vertiefen kann.
Die Idee, für ein solche Projekt wäre, eine Art "refresh" vom klassischen "Supreme Commander Forge Alliance" zu schreiben.
(Natürlich kein stumpfer Klon, sonder auch mit eigenen Ideen...)
Und so ein SC ähnliches Spiel auf den aktuellen Stand der Technik zu bringen, da SC bei einer gewissen Einheiten stärke sehr träge wird.
Geplant habe ich für dieses Projekt die Zeit neben dem Studium, also etwa 5 Jahre.
Die Sprache meiner Wahl ist C++, da ich mit dieser bereits mehr als drei Jahre Erfahrung habe.
Mir ist dabei durchaus bewusst, da 3 Jahre nicht ausreichen, um wirklich gut zu werden, doch ohne Herausforderungen kann man nicht wachsen.
Die Hauptfrage, die ich mir aktuell stelle ist, wie verhält es sich wenn ich die Einheiten nicht seriell über die CPU, sondern
parallel über die GPU berechnen lasse, da ich mir so gerade bei größeren Einheiten zahlen durch die massive Parallelisierung,
im Vergleich zum rechnen über die CPU starke Performancegewinne erhoffe.
Nun zum Grundlegenden:
Für die CPU habe ich folgende Threadeinteilung (theoretisch geplant), falls davon etwas sinnlos ist,
scheut euch nicht davor Verbesserungsvorschlägen zu kommentieren.
1. Mainthread | Synchronisierung der Threads, speichern usw. |
2. Thread | Socket, zur Kommunikation mit Mitspielern |
3. Thread | Nutzereingabe, um ein "freezen" der Oberfläche zu verhindern. |
4. Thread | Schnittstelle zur Grafikkarte, verschieben der Daten usw |
GPU | Berechnung der Truppen und Bildschirmausgabe. |
Die Truppenzahl wird dann wie folgt theoretisch beschränkt werden:
- Wenn der Speicher der Boottleneck ist: Verwendbarer Speicher minus Speicher für die Grafikdarstellung,
Verbleibender Speicher durch (Speicherbedarf pro Truppe mal Anzahl der Spieler)
ergibt dann die maximal mögliche Truppenzahl,
ohne massiv Daten aus dem Speicher verschieben zu müssen. - Wenn die Rechenleistung der Boottleneck ist:
Zeit pro berechneter Truppe mal erwünschter FPS Rate
durch die zu Verfügung stehenden Rechenkerne.
Wie ihr merkt, noch alles sehr theoretisch, da ich bisher nur mit einem Thread gearbeitet habe.
Daher habe ich nun folgende Fragen, die hoffentlich alle beantwortet werden können.
Wie stark beansprucht es die Karte, wenn ich z.B. CUDA Kerne bis zum Anschlag belaste?
Können dann überhaupt noch die Berechnungen für die Bildschirmausgabe ausgeführt werden?
Oder Hocken die Rechenkerne in einer Pipe und blockieren so diese Möglichkeit,
der gleichzeitigen Berechnung und Ausgabe auf dem Bildschirm?
Sollte das der Fall sein, ist es dann Besser, zwar alle Berechnungen der Truppenbewegungen mit voller Kapazität,
jedoch abwechselnd zur Grafikberechnung aus zu führen, oder lieber nicht alle Truppenbewegungen gleichzeitig zu erledigen?
Sprich einen Teil der Grafikleistung für die Truppenberechnung, den andere für die Darstellung zu nutzen.
Dann stellt sich mir noch die Frage nach der API (CUDA, OpenCL, Vulkan o.ä.)
Ich vermute mal, dass CUDA auf NVidiakarten schneller als OpenCL und Vulkan auf AMDkarten schneller als OpenCL laufen wird, oder?
Macht es dann Sinn, während der Installation/Laufzeit zu prüfen,
welche Grafikkarte verbaut ist und dann den entsprechend optimierten Code zu nutzen?
Zur Bildausgabe werde ich auf OpenGL setzten, da ich hauptsächlich Linux nutze und dieses Spiel primär für diese Plattform entwickeln möchte.
Zumal der Socket unter Linux deutlich einfacher zu Coden ist, als unter Windows

Bitte jetzt nicht direkt damit ankommen, "Du hast keine Ahnung wie Komplex das Thema ist" o.ä., ja es ist eine Herausforderung,
mir ist klar, dass Heutzutage Teams mit einigen Mitbarteitern an solchen Aufgaben programmieren und mir ist auch klar,
dass das eine Menge an Zeit brauchen wird, bis ich etwas einiger maßen performantes auf die Beine gestellt bekomme.
Doch in meinen Augen, ist genau diese Herausforderung und das tiefer gehende Verständnis in diesem Bereich all dies Wert.
Auch wenn ich an meine Grenzen stoßen werde, so bin ich zuversichtlich diese überschreiten zu können, ohne an den Hürden zu scheitern.
Ich hoffe auf eine schöne Zeit, mit interessanten Diskussionen und einem unentwegtem Wissensaustausch.
Ups


Ich bedanke mich dann bereits an dieser Stelle dafür, dass ihr euch all das durchgelesen habt.
Mit freundlichen Grüßen
Supercomputer