Ich habe mein Problem behoben. Es stellte sich als ziemlich subtil heraus, aber dank Ozair traf er den Nagel auf den Kopf. Meine spezifische Simulation liest nicht sehr viele Daten (nur die Initialisierungsparameter), sondern verbringt viel Zeit damit, berechnete Daten auszuspucken. Die grobe Art und Weise, die ich ursprünglich mit dem Standard-C ++ implementiert habe, file.open("tobewritten.dat")
ist sehr langsam, auch wenn dies von alleine geschieht. Wenn jedoch mehrere Instanzen ausgeführt werden, müssen die einzelnen Instanzen auf der Festplatte für die "Schreibzeit" lange warten.
Ich habe einige spezifische Lektionen gelernt:
cout << std::endl
spült den Puffer bei Gebrauch; Wenn der Puffer nicht voll ist, wird der schnellere Schreibvorgang in den RAM nicht optimal genutzt. Verwenden Sie"\n"
und schließen Sie die Datei am Ende. c ++ behandelt den Puffer auf die Festplatte, wenn er voll ist.Wenn Sie mehrere massive Datendateien (ich spreche GBs) gleichzeitig schreiben, ist es am besten, den Puffer manuell anzugeben. Im Moment habe ich den Puffer auf 50 MB gesetzt. Die Verwendung großer Puffer bedeutet, dass Ihr System mehr Zeit zwischen dem RAM und der CPU aufbringt und nur im Abstand von 50 MB auf die Festplatte (das langsame Bit) speichert
Verwenden Sie nicht einmal
cout
zum Schreiben in eine Datei. Es ist langsamer alssprintf
und seine Varianten.
Mit den oben beschriebenen Methoden habe ich von 28% CPU-Auslastung für jeden Prozess zu 100% CPU-Auslastung gewechselt. Der "steckenbleibende" STATE erscheint nicht mehr.