Prozesse gleichzeitig starten

Hallo,

gibt es einen Kniff, unter Linux mehrere Prozesse exakt gleichzeitig zu starten? Bislang benutze ich scripts der Art

#!/bin/sh

foobar &
foobar &
foobar &

wait

In der Theorie brauchen das Programm natuerlich immer gleich lang (von etwas Rauschen abgesehen). Nun zeigt sich aber, dass der erste Prozess bei ersten Starten verhaeltnismaessig lange braucht, der zweite dann schon richtig Spaene gibt, weil bereits cached und dann die Geschwindigkeit wieder runtergeht, weil ueberlastet bzw. die Prozesse sich um die Resourcen schlagen. Der Rechner hat auch genug Prozessoren, um alle Prozesse gleichzeitig laufen zu lassen. Mit numactl weise ich die Prozesse auch schon konkreten CPUs zu, damit das bloede Linux ja nicht erst auf den Gedanken kommt, zwei auf einen zu schicken. Hilft leider alles nix, die Prozesse starten (vermutlich) leicht versetzt, jedenfalls sind sie (sehr) unterschiedlich schnell. (Details: foo == stream und alle schwankt bei parallelen Laeufen (ohne OpenMP) um ca 30%.)

Irgendwelche Ideen?

Danke,
Gruss vom Frank.

Hi,

mach doch drei cronjobs draus :smile: auf die gleiche Uhrzeit
oder starte
sleep 2; prozess1 um xx:xx:00 und sleep 1; prozess1 umd xx:xx:01 :wink:

GrĂĽĂźe,
J+

Hallo,

miene Idee wäre, die Prozesse zu starten und jeweils sofort nach dem Start ein SIGSTOP zu schicken und dann alle gleichzeitig zum weiterlaufen zu bewegen.

GrĂĽĂźe,
Moritz

Hallo,

gibt es einen Kniff, unter Linux mehrere Prozesse exakt
gleichzeitig zu starten? Bislang benutze ich scripts der Art

#!/bin/sh

foobar &
foobar &
foobar &

wait

…

Hallo Frank,

meiner Meinung nach wird das von „aussen“, also vom Betriebsystem aus, sowieso niemals zuverlässig funktionieren. Man müsste die Software dahingehend ergänzen, dass sie nach dem Start auf ein Synchronisationssignal wartet, aber auch das führt nur zu einer besseren, nicht absoluten Gleichzeitigkeit des Starts.

Egal welches Betriebssystem, es gibt keine Garantie dafür, dass Prozesse gleich viel Rechenzeit erhalten, und wann diese zugeteilt wird, ist zwar rein theoretisch deterministisch, aber nicht beeinflussbar, also aus Sicht des Programmierers rein zufällig.

Die einzige denkbare Möglichkeit zum Parallellauf: für n Prozesse n+1 Prozessoren einbauen und die Prozesse fest an die Prozessoren binden. Selbst dann bleibt als Jitter die Zeit für die Verarbeitung der Synchronisation selbst.

Es ist natürlich auch durchaus denkbar, dass das BS dich veralbert, indem Code erst wirklich geladen wird, wenn er auch tatsächlich ausgeführt werden soll. Und was im Instruction Cache steht und was geholt werden muss, ist ebenso praktisch unvorhersagbar, wenn auch nicht wirklich zufällig.

Gruss Reinhard