Zeitliche Auflösung von Simulationen



  • Ich möchte eine physikalische Simulation mit zeitlich akkurat aufgelösten Vorgängen durchführen. Dabei will ich aber keine unnötigen Wartezeiten. Ich will nicht so etwas wie sleep(2). Ich will die zur Verfügung stehende Rechenkapazität auslasten können. Die Simulation soll vom Anwender nicht in Echtzeit beobachtet werden. Das Programm soll mit maximaler Geschwindigkeit die Simulation berechnen. Und danach kann der Anwender die einzelnen aufgezeichneten Vorgänge abspielen.

    Nun habe ich aber keine Erfahrung damit wie man so etwas am besten macht. Das was mir einfällt ist folgendes: ich habe eine Schleife. Ein Durchlauf würde den kleinst möglichen Zeitschritt der Simulation repräsentieren. Sagen wir jeder Durchlauf steht für 1 ms. Dabei ist es also egal wie lange ein Durchlauf wirklich dauert. Es wird mit maximaler Geschwindigkeit ausgeführt.
    Angenommen ich will einen physikalischen Vorgang simulieren der alle 2 ms aktiv wird und eine Dauer von 4 ms hat. Dann würde ich in jedem Schleifendurchlauf einen Zähler allein für diesen Vorgang hochzählen. Beim zweiten Durchlauf würde der Vorgang dann ausgelöst werden und nach weiteren 4 Durchläufen würde der Vorgang wieder deaktiviert werden.

    Das würde wohl funktionieren aber ist das ideal? Wenn ich 10.000 Vorgänge/Objekte habe, die nicht zeitgleich aktiviert werden, sondern dynamisch in der Simulation, dann müsste ich in jedem Schleifendurchlauf 10.000 Zähler verwalten und hochzählen.
    Wäre das unvermeidbar? Welche Möglichkeiten gibt es noch?



  • Was meinst du denn mit Zähler? Meinst du die Millisekunden?

    Sind die 10000 Vorgänge voneinander unabhängig oder liegen sie auf der gleichen Zeitachse?
    Wenn zweiteres der Fall ist, können doch alle 10000 Simulationen/Vorgänge den gleichen Zeitzähler/Schrittzähler verwenden.

    Vielleicht präzisierst du mal deinen Plan anhand eines Beispiels, z.b. V = s/t oder so. So dass klar wird, was du genau vorhast.

    Geht es dir jetzt um den Speicherverbrauch von 10000 Zählern oder die CPU-Last? Oder wo genau siehst du das Problem?



  • Ich würde für sowas einfach eine Liste mit Ereignisse machen und dem Zeitpunkt, zu dem sie eintreffen. Dann ordnet man die Liste und führt das nächste Ereignis aus, dabei können evtl. Folgeereignisse eintreten, die wieder neu in die Liste eingeordnet werden müssen. Es gibt Datenstrukturen wie priority queues, wo du dann eben nicht alle 10000 Ereignisse anschauen musst, sondern nur in der Größenordnung log n beim einsortieren. Und du hast dann auch keine Einschränkung das der kleinste Schritt nicht unter 1ms sein kann.


  • Mod

    Das nennt sich übrigens "event-driven simulation", wenn du dazu googeln möchtest. Das war in der Computerphysik ein semi-hype in den frühen 2000ern, aber seither ist man größtenteils wieder bei Simulationen mit konkreten Zeitschritten. Aber du fragst nicht für wissenschaftliche Simulationen, sondern Computerspiele, oder?



  • Ich versuche es mal konkreter zu beschreiben was ich meine.

    Ich will ein Neuronales Netz simulieren. Es soll eine einigermaßen realistische Simulation von biologischen Neuronen werden, um deren Verhalten bzw. den Verlauf von Signalen in einem begrenzten Umfang zu beobachten. Es sind dennoch mindestens einige Tausend Neuronen zu simulieren.

    Ich möchte untersuchen inwiefern zeitliche Prozesse einen Einfluss auf den Signalverlauf im Netz haben. Ein konkretes Beispiel für eine zeitliche Eigenschaft eines echten Neurons ist folgendes:
    Wenn ein Neuron von anderen Neuronen elektrische Impulse erhält gibt es selbst einen elektrischen Impuls weiter. Nachdem das Neuron einmal gefeuert hat, gibt es eine kurze Zeit wo das Neuron eine Ruhephase hat. In dem Zeitraum ist es für neue Impulse von anderen Neuronen nicht empfänglich.
    Ich muss also für jeden einzelnen Neuron ermitteln wann diese Ruhephase vorbei ist.

    Daher hatte ich die Idee mit Zählern. Ich möchte die ganze Simulation in diskreten Zeitschritten ablaufen lassen. Ich könnte jedem Neuron einen Zähler zuweisen. Dieser Zähler wird dann hochgezählt wenn das Neuron einmal gefeuert hat. Nachdem erreichen eines bestimmten Wertes wird der Zähler zurückgesetzt und das Neuron ist wieder für neue Impulse empfänglich.

    Und ich dachte mir es wäre vielleicht gut einen elementaren Zeitschritt für die gesamte Simulation zu definieren. Beispielsweise 1µs. Ein einziger Schleifendurchlauf würde dann diesen Zeitschritt repräsentieren. Wenn beispielsweise die Ruhephase eines Neurons 200 µs beansprucht. Würde die Schleife nach 200 Durchläufen genau diese Zeitspanne repräsentieren und könnte den Zustand des Neurons aktualisieren. Natürlich beginnen und enden die Ruhephasen Tausender Neuronen zu unterschiedlichen Zeitpunkten, da alle zu unterschiedlichen Zeitpunkten feuern können. In jedem Schleifendurchlauf müsste ich also die internen Zähler aller Neuronen überprüfen und gegebenenfalls neu setzen.
    Und damit wäre ich bei meinen 10.000 Zählern von denen ich im ernsten Beitrag schrieb.

    Warum ich unnötige CPU Wartezeiten vermeiden will: Wenn ein Prozess wie die eben beschriebene Ruhephase in der Simulation 200 µs dauert, will ich nicht in echt 200 µs warten. Ich will also nicht die internen Timer des Computers nutzen und die CPU ins Leerlauf versetzen. Ich will die Simulation ohne eine visuelle Ausgabe mit maximaler CPU Auslastung berechnen. Dabei zeichne ich die Zustände aller Neuronen während einem Zeitschritt in einer Datei auf. Die Datei importiere ich dann später und kann sie in einem Analyse Tool auswerten. Und mir auch eine visuelle Repräsentation der Daten anzeigen lassen und das ganze in beliebiger Geschwindigkeit vor und zurück abspielen.
    Der Grund für diese Vorgehensweise ist das größere Neuronale Netze nicht vernünftig in Echtzeit berechnet werden können. Für 1 Sekunde Zeitablauf in der Simulation benötigt die CPU vielleicht in echt 5 oder 15 Minuten Berechnungszeit.


  • Mod

    Und was ist dann deine Befürchtung? Das Vorgehen an sich ist ziemlich normal für eine Simulation. Der Rechenaufwand für die Änderung des internen Zustands von 10000 Teilchen ist nichts, was auch nur einen Taschenrechner sonderlich anstrengen würde. Lustig wird das erst, wenn gegenseitige Wechselwirkungen dazu kommen, denn 10000² (oder gar mehr) Rechnungen sind eine Hausnummer, die auch ein starker Parallelrechner nicht mal eben so packen würde. Da ist dann die wahre Kunst der Computersimulation, wie man so etwas in den Griff bekommt. Das wird ganz sicher auch eine große Schwierigkeit bei einem halbwegs realistischen Neuronenmodell sein, aber bisher scheint das nicht Teil deiner Überlegungen zu sein.



  • @SeppJ sagte in Zeitliche Auflösung von Simulationen:

    Und was ist dann deine Befürchtung? Das Vorgehen an sich ist ziemlich normal für eine Simulation. Der Rechenaufwand für die Änderung des internen Zustands von 10000 Teilchen ist nichts, was auch nur einen Taschenrechner sonderlich anstrengen würde. Lustig wird das erst, wenn gegenseitige Wechselwirkungen dazu kommen, denn 10000² (oder gar mehr) Rechnungen sind eine Hausnummer, die auch ein starker Parallelrechner nicht mal eben so packen würde.

    Eine Matrizenmultiplikation einer vollbesetzten Matrix hat O(N^3) an Komplexität. Ich habe schon auf einem Cluster Rechnungen mit Dimension 10.000 gemacht, es geht. Eine Iteration in dem betreffenden Physikprogramm hat ca. ein Tag gedauert und man brauchte mehrere Iterationen für ein brauchbares Ergebnis.



  • @SpielCode
    cool. Welche Modelle nimmst du? Ich habe damals auf Basis von Izhikevich gearbeitet ( rund 13 Jahre her ). Bin aber nicht mehr ganz auf dem Laufenden das die biologisch plausiblen Modelle angeht. Simulierst du auch die Synapsen inklusive Neurotransmitter?



  • @SpielCode Statt bei jedem Durchlauf der Simulation die Zähler aller Neuronen anzupassen könntest du in den Neuronen den Zeitpunkt (Nr. des Simulationsschritts) speichern zu dem sie wieder "empfänglich" werden. Kann was bringen, muss aber nicht.

    Ansonsten kann ich dir keine Tips geben da ich zu wenig (=quasi nichts) darüber weiss was zur der Simulation eines neuronalen Netzes sonst noch alles nötig ist.



  • @SpielCode Ist die Frage noch ungelöst? Beim Aufbau des Simulators könnte ich helfen, dann mußt Du keine Angst haben CPU Zeit zu verlieren. Sogar Paralellvwearbeitung wäre möglich.


Log in to reply