Plattformübergreifendes Tool zur Ausführung beliebigen Codes für die Forschung

Ich arbeite an einem akademischen Forschungsthema, das ziemlich viel Berechnung erfordert. Ich baue die Software in C++. Wenn ich an der Universität bin, habe ich Zugriff auf einen kräftigen Server, aber für meine Zeit zu Hause möchte ich meinen Code auf meinem Windows-Gaming-PC ausführen, der um einiges schneller ist als mein 5-jähriges MacBook Pro.

Gibt es also ein Tool, mit dem ich eine Mach-O-Binärdatei (OS X-Binärdatei) aus dem Speicher nehmen, über das Netzwerk auf den Windows-PC verschieben und dort mit der Ausführung fortfahren kann? Ich halte das für möglich, denn:

  • Ich verlasse mich nur auf reine Header-Bibliotheken (STL, Eigen).
  • Mach kein Multithreading.
  • Es werden keine OS X-spezifischen Aufrufe getätigt (keine Syscalls)

Ich stelle es mir so vor: x86 ist x86: Kopieren Sie einfach den Code in den Speicher, wie er ist. Ordnen Sie auf dem Zielcomputer einen identischen virtuellen Adressraum zu, übertragen Sie den x86-Prozessorstatus (unter Verwendung pushfund popfAnweisungen) und setzen Sie die Berechnungen fort.

Wenn so etwas existiert, würde es wahrscheinlich das Linken gegen eine Bibliothek beinhalten, die zwei Aufrufe hat wie:

  • moveToSlave(): Unterbrechen Sie die lokale Berechnung und verschieben Sie die gesamte Binärdatei auf die andere Maschine.
  • moveToMaster(): Unterbrechen Sie die Remote-Ausführung (die auf dem Remote-Computer lokal ist) und übertragen Sie den aktualisierten Speicherstatus zurück zum Master (meinem Laptop).

Ich weiß, dass es ein langer Weg ist, und eine solche Software wäre sehr experimentell.

Hast du Virtuelle Maschinen überprüft? Es scheint mir, dass die VM-Lösung am besten geeignet ist. Mir ist jedoch keine Funktion bekannt, die Ihre Anforderungen direkt abdeckt. aber Snapshots, Anhalten und Fortsetzen der VM könnten Ausgangspunkte sein.

Antworten (2)

Zunächst einmal ist es unwahrscheinlich, dass kompilierter C-Code von einem Betriebssystem (Windows) auf einem anderen (MacOS) erkannt wird. Nicht wegen der OP-Codes, die bei gleichem Prozessor gleich sind, sondern wegen der Struktur der ausführbaren Datei und auch der Speicherabbildung. Außerdem gibt es mehr OS-Aufrufe, als Sie vielleicht denken, zB malloc/new wird eine OS-Interaktion haben.

Für einen Großteil dieser Art von Arbeit wird häufig Python verwendet (mit C- oder Cython-Erweiterungen für das schwere Heben), teilweise wegen der Unabhängigkeit vom Betriebssystem. Es eignet sich auch hervorragend für die parallele Verarbeitung, einschließlich der verteilten Verarbeitung über ein Netzwerk.

Wenn Sie Ihre Verarbeitung in eine Reihe paralleler Aufgaben umstrukturieren und das Pub/Sub-Modell verwenden können, können Sie eine beliebige Anzahl von Knoten (von 1 aufwärts) haben, die an Ihrem Problem arbeiten, und wenn es richtig strukturiert ist, werden Sie dazu in der Lage sein einen Knoten zu einem beliebigen Zeitpunkt verlieren, wobei nur die Verarbeitung dieses Teils des Modells verloren geht und erneut durchgeführt werden muss. Wenn Sie also Maschinen wechseln müssen, starten Sie die neue Maschine, bevor Sie die alte stoppen, geben Sie ihr etwas Zeit, um sich mit dem Status Ihrer Verarbeitung zu synchronisieren, und schalten Sie dann die alte Maschine aus.

Dies ist ein sehr umfangreiches Thema und es gibt einige Bücher und viele wissenschaftliche Arbeiten zu diesem Thema.

Um endlich zu einer bestimmten Software für diese Art von Problem zu gelangen, ist eines der gängigen Tools NSQ .

  • Plattformübergreifend
  • Skalierbar – wenn Sie mehrere Plattformen gleichzeitig zur Verfügung haben, wird Ihre Verarbeitung schneller erledigt
  • Schnell
  • Unterstützung für mehrere Verarbeitungssprachen, einschließlich C, Python und Go.

Aber Sie müssen Ihr Problem und Ihren Code neu strukturieren, um ihn geeignet zu machen.

Wie @JawadAlShaikh vorgeschlagen hat, könnte die Verwendung einer virtuellen Maschine für das eigentliche Knirschen funktionieren. Ich habe jedoch gerade überprüft, dass VirtualBox den gespeicherten Status verwirft, wenn Sie versuchen, die VM zu exportieren.

Was funktionieren kann, ist, VirtualBox auf jedem Hostcomputer so einzurichten, dass er auf externe Medien (externe Festplatte über USB3 oder eSATA) verweist, um die tatsächlichen VMs und Konfigurationsinformationen auf jedem Computer zu speichern. Stecken Sie das Laufwerk ein, booten Sie die Maschine, führen Sie VBox aus, nehmen Sie den gespeicherten Zustand wieder auf und fahren Sie mit dem Rechnen fort.

Eine zweite Möglichkeit könnte sein, einen "Remote"-Server zu verwenden - entweder Ihren PC zu Hause oder einen, der online von einem der großen Cloud-Anbieter oder einem der kleineren wie linode.com gehostet wird - auf diese Weise können Sie von überall daran arbeiten und Ihre lokale Hardware spielt keine Rolle. Führen Sie für die Entwicklungsarbeit einen kleinen Maßstab aus, und wenn Sie dann einen großen Datensatz verarbeiten müssen, vergrößern Sie die Maschine und machen Sie es. Wenn der Data Crunch-Lauf abgeschlossen ist, verkleinern Sie ihn wieder.