1. Daten

1. Daten

Ich habe eine Rechenaufgabe in Matlab programmiert, die aus der Verarbeitung großer Datenmengen besteht, die beim Start in den Speicher eingelesen werden. Die Laufzeit liegt im Bereich von Stunden bis Tagen. Die Aufgabe ist Single-Threaded.

Um diese Aufgabe auszuführen, stehen mir mehrere verschiedene Linux-Rechner zur Verfügung. Die Rechner unterliegen aufgrund bereits laufender Aufgaben, die in absehbarer Zukunft weiterlaufen werden, unterschiedlicher Systemlast. Alle Rechner verfügen über eine amd64-Architektur, unterscheiden sich jedoch hinsichtlich der Anzahl physischer Kerne, der Anzahl virtueller Kerne und des CPU-Modells einschließlich Taktfrequenz und anderer Faktoren.

Meine Frage:Gibt es eine prinzipielle Möglichkeit, eine der Maschinen für die Ausführung der Aufgabe auszuwählen, mit dem Ziel, die Aufgabe so schnell wie möglich zu erledigen?


Der folgende Teil wurde basierend auf der Antwort von Doktoro Reichard aktualisiert.

Meine grobe Idee, wie man einen ungefähren Hinweis darauf bekommt, welche Maschine am schnellsten sein wird, besteht darin, zwei Aspekte zu kombinieren:

(1) Schätzen Sie, wie viel von den Verarbeitungsressourcen eine Maschine meinem Task zuweisen würde, wenn er dort ausgeführt würde, was ich "relative Geschwindigkeit" nenne: Wenn die Maschine im Leerlauf ist, wird mein Task per Definition mit der relativen Geschwindigkeit 1 ausgeführt. Wenn die aktuelle Auslastung L und die Anzahl der Kerne C ist, beträgt die Auslastung nach dem Absenden meines Tasks L+1 und die relative Ausführungsgeschwindigkeit R = min(C / (L+1), 1). Der Min-Operator, weil der Prozess nicht mehr als einen Kern nutzen kann. – Ist diese Berechnung als Indikator der erreichbaren Verarbeitungsgeschwindigkeit relativ zum Optimum, das auf der Maschine bei ihrer aktuellen Auslastung möglich ist, korrekt? Und ist die relevante Zahl C die Anzahl der physischen Kerne oder die Anzahl der virtuellen Kerne, wobei letztere wegen Hyperthreading doppelt so groß ist?

(2) Schätzen Sie, wie schnell die Aufgabe im Verhältnis auf den verschiedenen Maschinen ausgeführt werden würde, wenn sie alle im Leerlauf wären, basierend auf einem Indikator für die Maschinenleistung. Dies sollte nicht die Taktfrequenz sein, sondern ein entsprechend gewählter Benchmark.

Die Auswahl des Automaten erfolgt dann auf Grundlage des Automaten, der das größte Produkt der Zahlen (1) und (2) aufweist.

Antwort1

Hierauf gibt es aufgrund der Funktionsweise von Computern keine eindeutige Antwort. Ich werde aber versuchen, ein paar Richtlinien bereitzustellen, die Ihnen dabei helfen herauszufinden, welches Verfahren am schnellsten ist.

Ich analysiere Ihre Aussagen, um Ihnen zu sagen, was Sie herausfinden können und was nicht.

1. Daten

In Ihren ersten Absätzen haben Sie angegeben, dass Sie alle Daten in den Speicher geladen und aus diesem gelesen haben. Das ist gut für die Geschwindigkeit, da der Speicher in Bezug auf die Bandbreite unübertroffen ist. Wenn Ihr Programm eine Festplatte verwendet (unabhängig davon, ob es sich um eine Festplatte, eine SSD oder einen USB-Stick handelt), könnte dies möglicherweise einen Engpass bei der Ausführungsgeschwindigkeit Ihres Programms darstellen.

Dies liegt an der Übertragungsgeschwindigkeit. RAM hat fast direkten Zugriff auf den Prozessor. Festplatten müssen eine Verbindung mit einer viel geringeren Bandbreite als RAM durchlaufen und bei Festplatten muss die zum Abrufen und Speichern der Daten benötigte Zeit berücksichtigt werden.

2. Betriebssystem

Das verwendete Betriebssystem hat zwar einen gewissen Einfluss auf die Geschwindigkeit, dieser kann jedoch als geringfügig angesehen werden.

3. Prozessorarchitektur (oder Befehlssätze)

Dies ist ein relevanter Aspekt. Obwohl Sie angegeben haben, dass die Maschinen amd64-Prozessoren verwenden, kann es einige Unterschiede in den verwendeten Befehlssätzen geben.

Betrachten wir zum Beispiel dieOpteronund dasSempronSerie von Prozessoren. Ein wesentlicher Unterschied zwischen ihnen ist, dass letztereSSE3Unterstützung.

SSE3 ermöglicht neuere und effizientere Möglichkeiten zur Datenverarbeitung (insbesondere Array-Operationen), Operationen, die in früheren Befehlssätzen mit weniger effizienten Prozessen durchgeführt würden.

In dieser HinsichtneuereProzessoren sindschneller durch Design, da sie effizientere Befehlssätze unterstützen.

4. Systemlast

Dies ist sozusagen der letzte Nagel im Sarg. Sie können die Auslastung eines Computers nicht linear berechnen, es sei denn, Sie wissen, wie jedes Programm funktioniert. Dies bedeutet, dass Sie möglicherweise 10.000 Prozesse laufen haben, aber eine Restlast aufweisen oder dass ein einziger Multithread-Prozess die gesamte Prozessorzeit verschwendet.

Aber... analysieren wir das weiter. Das Hinzufügen von Prozessen bedeutet, dem zugrunde liegenden System Daten hinzuzufügen, damit es weiß, dass der Prozess existiert und wie viel Prozessorzeit für ihn bereitgestellt werden sollte. In dieser Hinsichtweniger ProzesseSindbesseraus Geschwindigkeitsgründen, da der Kernel/Prozessor besser entscheiden kann, wie viel Zeit zur Verfügung gestellt werden soll.

Ein weiterer zu berücksichtigender Punkt ist die Priorität, die der Kernel den Prozessen zuweist. Die Prozesse mit der höchsten Priorität beanspruchen die meiste Zeit des Prozessors.

Sie können sich letztendlich ein System vorstellen, das Ihrem Prozess die höchste Priorität einräumt und alle anderen Prozesse ewig warten lässt, bis Ihr Prozess anhält. Dabei wird Ihre Prozessgeschwindigkeit von der CPU bestimmt.

5. Zentralprozessor

Betrachten wir Ihre Punkte: Kerne und CPU-Taktgeschwindigkeit.

Es ist denkbar, dass der Kernel einige Prozesse auf andere Kerne verlagert. Im Grenzfall kann Ihrem Prozess ein ganzer Kern zugewiesen werden. In dieser Hinsicht können mehr Kerne dazu führen, dass mehr Prozesse gleichzeitig (und folglich schneller) ausgeführt werden.

Ich weiß nicht viel über Multithreading, daher überlasse ich das jemandem, der sich damit auskennt.

Taktfrequenzist nichtein klarer Indikator für die Prozessoreffizienz. Um dies zu begründen, stelle ich Ihnen den „Kampf“ zwischen der Verwendung von Intel- und PowerPC-Prozessoren in Apple-Hardware vor. Apple argumentierte, dass der Hauptgrund für die Bevorzugung von PowerPC-Prozessoren gegenüber Intel trotz zunehmender Prozessorgeschwindigkeiten bei Intel-Prozessoren darin liege, dass PowerPC eine bessere Leistung erbringe, da sie mehr Operationen pro Sekunde verarbeiten könnten als ihre Konkurrenten. Letztendlich entschied sich Apple aufgrund von Leistungsbedenken und anderen wirtschaftlichen Faktoren für Intel.

FLOPS(für Floating-Point Operations Per Second) ist ein Maß für die Computerleistung, insbesondere in Bereichen wissenschaftlicher Berechnungen, in denen häufig Gleitkommaberechnungen verwendet werden, ähnlich den älteren, einfacheren Anweisungen pro Sekunde. Dies könnte ein besseres Maß als die Taktfrequenz sein, wenn Ihre Arbeit stark auf diese Art von Operationen angewiesen ist, was für Sie als Matlab-Benutzer eine Möglichkeit sein könnte.

Es handelt sich jedoch nicht um eine sehr offengelegte Menge (da sie davon abhängt,was fürOperationen führen Sie aus). Ich habe einige Benchmarks gefunden aufOverclock.netIch weise auf diese beiden hin:

  • AMD Phenom Ix4 9850 @2,83 GHzArbeitsspeicher 754 MHz 5-5-5-15GFLOPS:27.5
  • AMD Phenom IIx2 555 @4,12 GHzArbeitsspeicher 1000 MHz 5-5-5-18Anzahl der Flops: 26

Wie Sie sehen, kann selbst die Leistung von Prozessoren mit doppelter Geschwindigkeit schlechter sein als die von Prozessoren mit halber Geschwindigkeit.

Endeffekt

Es gibt keine klare FormelSie können die Laufzeit schätzen, da es unendlich viele Faktoren gibt, die bei der Verarbeitung eines Programms eine Rolle spielen. Es gibt einige Faustregeln, die ich zusammenfasse (ich habe versucht, sie zu sortieren nachBedeutung):

  • Es ist schneller, alle (oder die meisten verwendeten) Daten im RAM zu haben. (Die Datenspeicherung ist der Hauptengpass in jedem Prozess.)
  • Je weniger Prozesse auf derselben Maschine laufen, desto besser.
  • Mehr Kerne sind besser.
  • Neuere Prozessoren sind konstruktionsbedingt schneller.
  • Die CPU-Geschwindigkeit ist einrauhGeschwindigkeitsindikator (da RAM-Latenz und andere Faktoren eingreifen)
  • Sie können die Maschine bitten, Ihrem Prozess die höchste Priorität einzuräumen. Die Maschinewerde versuchenum Ihrem Prozess mehr Zeit zu widmen. (wenn ich sagewerde versuchen, ich meine, dass die Maschine nicht verpflichtet ist, Ihrem Prozess mehr Zeit zu geben, sie versucht, alles auszugleichen, weshalb der 2. Punkt existiert).

Ich bin noch etwas zögerlich, eine genaue Formel zu nennen, aber ich glaube, ich kann Ihnen einesehr, sehr ungefähreine, basierend auf der Ausgabe Ihrer Kommentare. Ich kann nicht über Multithreading sprechen, daher betrachte ich alle Kerne als unabhängig. Für diese Demonstration wird Folgendes angenommen:

  • Alle Prozesse werden gleich belastet.
  • Prozesse warten nicht auf Eingabe/Ausgabe.
  • Die Speichergeschwindigkeit beträgtvermutetkein Faktor zu sein.
  • Alle Prozesse sind Single-Threaded-Prozesse. Sie haben die gleiche Priorität.

Der Engpass ist dabei die Kapazität der CPU. Für jede CPU wäre die relative Belastung für jeden Prozess also wie folgt:

R = min(C / N ; 1)

Dabei ist R die relative Auslastung, C die Anzahl der Kerne in der CPU und N die Anzahl der aktiven Prozesse. Dies setzt jedoch voraus, dass das System die gesamte Auslastung gleichmäßig und perfekt auf die Kerne verteilen kann, was jedoch nicht immer der Fall sein muss.

Multiplizieren Sie die relative Auslastung der CPU mit der Maßeinheit (UM) Ihrer Wahl (z. B. GHz oder GFLOPS) und Sie erhalten ein Maß dafür, wie „schnell“ der Prozess sein könnte.

Speed = R * UM

Damit ist Ihre Formel richtig. Aber bitte,bitte, bitteBeachten Sie die Menge an Annahmen, die ich treffen musste. Dies ist weit entfernt von einem realen Fall. Dies wird Ihnen keine genaue Menge geben, sondern einebegründete Vermutung.

Ihr zweiter Punkt ist derselbe wie der erste (tatsächlich beantworten Sie ihn mit Ihrer Frage). Kurz gesagt, esIstder Leistungsindikator der Maschine (als R = 1), daher stellt sich die Frage, wie man einen auswählt. Dies sollten Sie selbst analysieren: Sie können GHz mal Anzahl der Kerne oder GFLOPS oder eine Kombination aus beiden verwenden.

Es gibt Programme (an die ich mich beim Schreiben der ersten Antwort hätte erinnern sollen), die Benchmarks für CPUs durchführen können, und aus diesen können Sie einige Werte erhalten, die Ihnen bei Ihrer Entscheidung helfen könnten. Ich habe SiSoftware Sandra (das auf meiner ziemlich alten Version einen Benchmark für Prozessorarithmetik hat), aber ich nehme anDa sind andere.

In diesem Fall würde die Multiplikation von 1) und 2) keinen Unterschied ergeben, es sei denn, Sie würden unterschiedliche Maßeinheiten verwenden.

verwandte Informationen