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

41

03.11.2012, 13:33

Hi,

also ich habe es probiert. Du hast recht es geht 25% schneller.
Ich habe die Raster(Grid)-Klasse noch verbessert. Besser gesagt das Einspeichern und entfernen aus dem Grid.
So gehe 32k Partikel mit für mich akzeptablem Tempo zu rendern. (0,04 sec pro Frame)


EINE SACHE IST ALLERDINGS SEHR KOMISCH?(
Die CPU Auslastung liegt bei nur 12-13%
Das ist doch nicht normal. Wie kann ich die CPU besser auslasten?
Kann es daran liegen das mein Laptop einen Intel i7 Processor hat? Hat der 7 Cores?
Wenn ja wäre Multiheading ja mal was oder was meint ihr? :wacko:

LG
Bilder zu meinem Projekt: ParSim

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Horus« (03.11.2012, 13:39)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

42

03.11.2012, 13:54

Er hat 4 echte Cores und 4 simulierte. Macht 8. Das heißt maximal 12.5% Gesamt-System-Last, wenn ein Kern unter Volllast steht. Also ja, wenn Du das auf 4 Kerne aufteilen kannst, bist Du auch etwa 4mal so schnell.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

43

03.11.2012, 13:55

EINE SACHE IST ALLERDINGS SEHR KOMISCH?(
Die CPU Auslastung liegt bei nur 12-13%
Das ist doch nicht normal. Wie kann ich die CPU besser auslasten?
Kann es daran liegen das mein Laptop einen Intel i7 Processor hat? Hat der 7 Cores?
Wenn ja wäre Multiheading ja mal was oder was meint ihr? :wacko:

Der hat nicht 7 Cores, sondern vermutlich 4 physikalische (gibt aber auch welche mit 2 und 6) und 8 logische Cores (Hyperthreading), was die 12% Auslastung genau erklärt.

Multithreading wäre natürlich eine Möglichkeit, wird aber sehr schnell sehr komplex und nicht alles ist überhaupt parallelisierbar...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (03.11.2012, 14:01)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

44

03.11.2012, 15:51

Zeigerarithmetik ist etwas ganz anderes als Zeiger. Vom Prinzip her sind in C# alles das Zeigertypen, was eine Instanz einer Klasse ist oder per new erzeugt wurde.

Aber nicht structs (die werden auch per "new" erzeugt).

45

03.11.2012, 16:05

Zitat

Also ja, wenn Du das auf 4 Kerne aufteilen kannst, bist Du auch etwa 4mal so schnel
Sehr gut:thumbsup:


Zitat

wird aber sehr schnell sehr komplex und nicht alles ist überhaupt parallelisierbar...
Oh nein! :thumbdown:
Diese ganze C# überfordert mich total!


Ich kann mir das in der Umsetzung noch nicht so richtig vorstellen... Daher eine Frage zum einem Konkreten Beispiel:

Die Simulation besteht aus 2 "Haupt"- Schlefen.

ERSTE HAUPTSCHLEIFE
for (int p = 0; p < Config.ParticleMaximum; p++)
{
Provider.Particle[p].Render();//Physikalisches Rendering
Store(p);//Aktualisierung im Grid
}

ZWEITE HAUPTSCHLEIFE
private void PassAllSectors()
{
for (int x = 1; x < Config.SimulationSpace - 1; x++)
{
for (int y = 1; y < Config.SimulationSpace - 1; y++)
{
for (int p = 0; p < Grid.Sector[x, y].Count; p++)
{
//Kollisionssuche
}
}
}
}

Dann wieder ERSTE HAUPTSCHLEIFE

Kann ich nicht jetzt "einfach" den ersten Thread den ersten Teil der ersten Hauptschleife durchlaufen lassen usw.
Dann wenn alle durch sind gleiches spiel bei der zweiten Hauptschleife. Erster Thread macht ersten teil :for (int x = 1; x < Config.SimulationSpace /8; x++) usw...

Oder verstehe ich das ganze irgendwie falsch?


Als Dank für die ganzen Infos ein Bild der Partikel.
Zwei Rechtecke sind ineinander geflogen.

Bilder mögen ja alle gerne oder? :D

EDIT: DA ein Core ja 20K Partikel gut schafft, und der Rechenaufwand fast linear ansteigt, so müssten ja 160K Partikel gut klappen:rolleyes:
»Horus« hat folgendes Bild angehängt:
  • kol.jpg
Bilder zu meinem Projekt: ParSim

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Horus« (03.11.2012, 16:10)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

46

03.11.2012, 16:08

Zeigerarithmetik ist etwas ganz anderes als Zeiger. Vom Prinzip her sind in C# alles das Zeigertypen, was eine Instanz einer Klasse ist oder per new erzeugt wurde.

Aber nicht structs (die werden auch per "new" erzeugt).

Jo. Das sind Value-Typen, keine Referenz-Typen. Eigentlich total absurd, wenn man's sich's mal so überlegt :D
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]

47

04.11.2012, 20:43

Ich nutze jetzt Multithreading :D

Ich denke es ist mir alles ganz gut gelungen mit der Umsetzung. Zumindest sieht die Simulation aus wie zuvor. Leider ist alles höllisch langsam. Ich habe einen verdacht woran es liegt. Aber leider weiß ich keine Lösung.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void Render()
{
  Allocator Allocator;//Teilt die Partikel bzw. Sektoren für die Header ein

  for (int i = 0; i < Cores; i++)//Auf Partikelrender festlegen
    ThreadParticle = new Thread(RenderParticles);

  for (int i = 0; i < Cores; i++)//Starten
  {
    Allocator.Start = i * (Config.ParticleMaximum - 1) / Cores;
    Allocator.End = 1 + Allocator.Start + (Config.ParticleMaximum - 1) / Cores;
    ThreadParticle.Start(Allocator);
  }
  for (int i = 0; i < Cores; i++)//Joinen
    ThreadParticle.Join();
}


Hat es damit zu tun?

C#-Quelltext

1
2
for (int i = 0; i < Cores; i++)//Auf Partikelrender festlegen
  ThreadParticle = new Thread(RenderParticles);


Obwohl ich es in dem Setup der Übergeordneten Klasse (Engineklasse ) doch zugewiesen habe:

C#-Quelltext

1
2
3
4
5
6
7
public void SetUp()
{
  Cores = Environment.ProcessorCount*2;
  ThreadParticle = new Thread[Cores];
  for (int i = 0; i < Cores; i++)
    ThreadParticle[i] = new Thread(RenderParticles);
}


Hat jemand dazu eine Idee? Wieso geht das mit den Multi-Threads langamer als mit einem?
(Sorry, dass ich den Code nicht richtig posten kann. Die Anzeige zerschießt sich immer)

LG


Edit by dot: Code Tags
Bilder zu meinem Projekt: ParSim

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (05.11.2012, 13:10)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

48

04.11.2012, 21:09

Du solltest nochmal Dein "Join" überdenken. Du joinst da nämlich n-mal den selben Thread, die anderen laufen fröhlich asynchron weiter. Wundert mich, dass Du da nicht in heftigere Probleme hinein läufst. Außerdem klingt "Render" im Methoden-Namen für mich nicht danach, als ob das tatsächlich parallel funktioniert. Kann, muss nicht.

Edit:
Oh Backe, du erzeugst sogar n-mal EINEN Thread und startest den dann auch noch n-mal. Schau Dir nochmal genau an, was Du da mit den drei nacheinander ausgeführten Schleifen eigentlich anrichtest und korrigiere das. Kleiner Tipp: List oder Array wäre hier irgendwie angebracht.
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 2 mal editiert, zuletzt von »BlueCobold« (04.11.2012, 21:16)


49

05.11.2012, 13:03

@Blucobold, das Joinen habe ich überdacht^^ Das mache ich jetzt nicht mehr.


Zitat

Schau Dir nochmal genau an, was Du da mit den drei nacheinander ausgeführten Schleifen eigentlich anrichtest und korrigiere das.

Ich verstehe nichts.

Zitat

Kleiner Tipp: List oder Array wäre hier irgendwie angebracht.
Ich habe doch einen Array von Threads...
Sorry ich verstehe viele nicht würde das aber gerne lernen. Tutorials usw habe ich einige gelesen.

Ich werde damit beginnen einige Experimente mit kleinen "sinnlosen" Multithreading Programmen zu machen, mich mit Multithreading vertraut machen. Eine frage ist dabei schon aufgekommen?

Kann es sein, dass der zeitgleiche Zugriff mehrerer Threads auf eine Variable dazu führen kann, dass einige Änderungen an der Variable nicht gelingen ?(

Muss ich also nicht nur die Zugriffe auf Variablen von verschiedenen Multithreads durchführen, sondern z.B. die variable

C#-Quelltext

1
Particle[] Particle = new Particle[Particlemaximum]


in mehrere Variablen aufteilen?

C#-Quelltext

1
Particle[][] Particle = new Particle[Particlemaximum/Cores][Cores];



LG


Edit by dot: Code Tags
Bilder zu meinem Projekt: ParSim

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (05.11.2012, 13:13)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

50

05.11.2012, 13:12

Joinen musst Du sie schon. Aber korrekt!
Und nein, die Render-Methode hat keinen Array. Die überschreibt ständig die selbe lokale Variable! Zeile 6 zum Beispiel. Die gesamte Methode hat mehrere Fehler dieser Art.

Wenn mehrere Threads schreibend auf die *selbe* Variable zugreifen, dann bekommst Du arge Probleme, weil sie natürlich alle irgendwann machen und die Operationen nicht mehr "atomar" sind. Das ist ein typisches Problem bei Multithreading und muss entsprechend synchronisiert werden. Dazu findest Du aber tausende Dokumente im Netz.
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« (05.11.2012, 13:19)


Werbeanzeige