Sind Algorithmen von Computerarchitekturen abhängig?


22

Ich habe irgendwo gelesen (habe vergessen, um welches Buch es sich handelt), dass Algorithmen unabhängig von Computerarchitekturen sind. Einige sagen sogar, Algorithmen seien selbst Berechnungen (Maschinen?)?

Andererseits haben Bücher über parallele Programmierung Kapitel über parallele Algorithmen. Es scheint, als ob parallele Algorithmen von parallelen Architekturen abhängen.

Ich glaube, ich vermisse ein paar große Bilder? Vielen Dank.


ist quicksort besser als sortieren zusammenführen?
AK_,

Parallele Algorithmen können auf Singlethread-Architekturen ausgeführt werden. Time Slicing wird von den meisten dieser Architekturen unterstützt, und wer sagt, dass parallele Tasks gleichzeitig ausgeführt werden müssen? Wenn A und B parallel sind, warum können Sie dann B nicht ausführen? Oder verschachteln Sie sie, wenn sich eine auf die andere verlässt (aber das ist im Allgemeinen eine schlechte Idee).

3
Algorithmen werden gegen eine abstrakte Maschine spezifiziert . Eine typische eine , die eine Idealisierung des heutigen Multi-Core - PCs ist heißt PRAM (Parallel Random Access - Maschine , manchmal weiter in EREW klassifizierte (exklusive Memory Read / Write) oder CRCW (concurrent Speicher lesen / schreiben).
rwong

@rwong: Sind abstrakte Maschinen dann völlig unabhängig von Computerarchitekturen, wenn es Algorithmen sind?
Tim

2
Algorithmen (und Datenstrukturen) können für bestimmte Architekturen optimiert werden - z. B. ist ein B + Tree eine assoziative Datenstruktur, die für Architekturen optimiert ist, bei denen das Lesen eines großen Datenblocks kostengünstiger ist als das Lesen mehrerer kleiner Blöcke.
user253751

Antworten:


20

Algorithmen sind eine Reihe von Schritten zur Lösung eines bestimmten Problems. Das Rezept zur Lösung des Problems, wenn Sie so wollen. "Programme" machen natürlich das Gleiche; Wir verwenden "Algorithmus", um die "verallgemeinerten" oder "allgemein anwendbaren" Rezepte vorzuschlagen, die von bestimmten Maschinenkonstruktionen, Programmiersprachen und dergleichen unabhängig sind.

Algorithmen sind allgemein gehalten, können jedoch von einigen vorhandenen Merkmalen abhängen. "Gleichzeitige Algorithmen" können beispielsweise davon abhängen, dass Sie einen Mechanismus haben, mit dem verschiedene Programme gleichzeitig ausgeführt werden. "Verteilte Algorithmen" können davon abhängen, dass Sie mehr als ein System in einer kooperierenden Gruppe und ein Netzwerk oder ein anderes Kommunikationsschema zwischen ihnen haben. In ähnlicher Weise sind "parallele Algorithmen" häufig solche, die für die Ausführung bei mehreren Verarbeitungseinheiten ausgelegt sind - möglicherweise viele, viele Verarbeitungseinheiten und die Art von Kommunikationseinrichtungen, die bei großen Arrays von Verarbeitungseinheiten üblich sind. Sie können möglicherweise einen "parallelen Algorithmus" ausführen, selbst wenn Sie nur einen Computer oder eine CPU haben - aber es ist nicht besonders interessant, wie es ist, wenn Verkehrsingenieure


13

Algorithmen sind unabhängig von der Computerarchitektur. Das liegt daran, dass Algorithmen eine Reihe von Prozessen definieren, die ein Problem lösen. Unabhängig von den Architekturen werden Sortieralgorithmen immer sortiert. Es würde nicht plötzlich 3D-Zeichnungen auf einigen Architekturen rendern.

Wenn Sie darüber nachdenken, ist dies eigentlich intuitiv. Google Chrome (bei dem es sich lediglich um eine Sammlung von Algorithmen handelt) ist ein Webbrowser, der für jede Architektur kompiliert wird. Auf einigen Architekturen würde es nicht plötzlich zu einem Gerätetreiber.

Die Geschwindigkeit, mit der Algorithmen ausgeführt werden, hängt jedoch von den Architekturen ab. Einige Algorithmen arbeiten je nach Architektur schneller als andere.

Wenn Sie darüber nachdenken, ist dies auch tatsächlich intuitiv. Bei einem gegebenen Algorithmus ist es dem Hardware-Designer immer möglich, eine Architektur zu entwerfen, die diesen Algorithmus spezifisch beschleunigt. Das ist ein Grund, warum es Dinge wie 3D-beschleunigte Grafikkarten und Bitcoin-Miner-Beschleuniger gibt.

Wenn man von parallelen Algorithmen spricht, spricht man von einer Familie von Algorithmen, die auf parallelen Architekturen schneller arbeiten können. Es gibt viele Algorithmen, die durch parallele Architekturen nicht verbessert werden. Die Identifizierung neuer Algorithmen für dasselbe Problem, die gut parallel funktionieren, ist daher ein aktives Forschungsgebiet.

Aber diese Algorithmen machen immer noch die gleichen Dinge. Architekturen ändern nicht, was sie tun.


"Die Geschwindigkeit, mit der Algorithmen ausgeführt werden, hängt jedoch von den Architekturen ab. Einige Algorithmen arbeiten je nach Architektur schneller als andere." Ich denke, das ist eine wertvolle Antwort.
Rıdvan Nuri Göçmen

4

"Es scheint, als ob parallele Algorithmen von parallelen Architekturen abhängen."

Meiner Meinung nach lautet die Antwort einfach: nein. Allgemein bekomme ich nur die Eigenschaften

  • Parallelität
  • Wortgröße (implizite Ressourcenbegrenzung)

wenn man an Hardware-Architektur denkt.

In Bezug auf die Parallelität können Sie einen beliebigen parallelen Algorithmus stapelweise berechnen und einen beliebigen parallelen Bogen seriell arbeiten lassen, damit der Algorithmus nicht davon abhängt. Die Wortgröße kann ein Problem für die numerische Stabilität sein, nicht jedoch für den Algorithmus. Ressourcenlimits wie 64bit können nur 2 ^ 64 verschiedene Zahlen beschreiben, könnten ein Problem sein, aber die Elemente sind begrenzt.

Natürlich kann es einige Algorithmen geben, die von einigen erweiterten Befehlssätzen abhängen, aber zumindest kann alles mit einfachen mathematischen Methoden beschrieben werden.

Beispielsweise können sich beim Quanten-Computing einige Big-O-Werte ändern, und das würde ich dann sagen

"Algorithmen sind unabhängig von Computerarchitekturen"

ist nicht mehr wahr.


4

Algorithmen hängen nicht von der Computerarchitektur ab, die Effizienz der Ausführung eines bestimmten Algorithmus hängt jedoch von der Architektur ab. Alle Turing Complete-Maschinen können alle anderen Turing Complete-Maschinen emulieren, obwohl einige Maschinen in einem Punkt besser wären als andere.

Was wir unter gleichzeitigen Algorithmen verstehen, ist, dass der Algorithmus gut funktioniert oder die Parallelität auf dem Computer ausnutzen kann, möglicherweise weil weniger Sperren erforderlich sind, als dies ansonsten für Algorithmen erforderlich gewesen wäre, die nicht speziell für den gleichzeitigen Computer entwickelt wurden, oder möglicherweise, weil Algorithmus nutzt Teilen und Erobern effektiv, um die volle Leistung der Maschine zu nutzen. Das Ausführen des Algorithmus auf einem nicht gleichzeitig ausgeführten Computer ist zwar weiterhin möglich, jedoch möglicherweise nicht so effizient, oder es sind zusätzliche Sperren erforderlich, um die ordnungsgemäße Ausführung zu gewährleisten.

Es gibt auch Algorithmen, die die Besonderheiten einer bestimmten Architektur ausnutzen sollen, z. B. cachefreundliche Algorithmen, mit denen das Caching optimiert wird. Diese Algorithmen sind in Computern möglicherweise weniger effizient, wenn sie nicht wie vom Algorithmus angenommen zwischengespeichert werden.


3

Theoretisch sind Algorithmen völlig unabhängig von der Architektur. Sie können immer eine parallele Architektur auf einem Time-Sliced-System mit einem Problem emulieren. Sie können die Vernunft überhaupt ohne eine Architektur über Algorithmen. Knuths Buch verwendet eine fiktive Architektur.

In der Praxis gibt es Algorithmen, die versuchen, eine bessere Laufzeit bei gleicher "O" -Komplexität zu erzielen, indem die Verwendung von Cache-Hardware und Synchronisationsprimitiven optimiert wird.


3

Ja und nein. Dies hängt von den Einschränkungen ab, die Sie erfüllen möchten, und von den Voraussetzungen, die zum Ausführen Ihres Algorithmus erforderlich sind.

Im Idealfall ist ein Algorithmus ein abstraktes Rezept , das Schritt für Schritt festlegt, wie etwas zu tun ist. Algorithmen wurden so definiert mit dem Ziel der Reproduzierbarkeit und späteren Automatisierung. Algorithmen stammen aus Lambda-Berechnungen, sodass Sie leicht erkennen können, warum sie so erstellt wurden. Diese Definition ist die übliche, aber moderne Algorithmen können nicht sequentiell (nicht schrittweise, wie bei gleichzeitigen Algorithmen, oder logisch, wie bei der Vereinheitlichung), nicht linear (stochastische Algorithmen) oder einfach nur merkwürdig (Quantenalgorithmen) sein Algorithmen), aber ich werde das weitergeben.

Daher sollte ein Algorithmus im Idealfall so abstrakt wie möglich sein, ohne Hardware zu berücksichtigen.

Aber wie bei jedem System müssen Sie einige Axiome definieren , um nicht nur ein kohärentes System zu erhalten, sondern auch Zeit zu gewinnen. Beispielsweise setzen die meisten Algorithmen zumindest implizit voraus, dass sie auf einer Von-Neumann-Maschine definiert sind. Wenn dies nicht der Fall wäre, müssten sie explizit alle Teile des Systems definieren, auf denen sie ausgeführt werden müssen (da dies für die Reproduktion des Rezepts erforderlich ist, ist dies eine Art Vorbedingung). Außerdem basieren Algorithmen häufig auf allgemeinen Befehlen wie write (), ohne diese vollständig zu definieren.

Ein weiterer Grund, warum Algorithmen nicht so abstrakt von der Hardwarearchitektur sind, liegt darin, dass Sie einige Einschränkungen erfüllen müssen .

Angenommen, Sie arbeiten an eingebetteten Systemen. Dann können Sie sich wahrscheinlich nicht auf dieselbe Menge an Ressourcen verlassen, die Sie auf Arbeitsstationen haben. Eine der zurückhaltendsten Ressourcen ist wahrscheinlich das Gedächtnis. Die meisten Algorithmen tendieren jedoch dazu, die Zeitkomplexität (Ausführungsgeschwindigkeit auf der CPU) und nicht die Speicherkomplexität (Speichermenge, die zum Bearbeiten der Daten erforderlich ist) zu optimieren. Für diese Systeme wurden speicheroptimierte Algorithmen entwickelt, bei denen nicht speicheroptimierte Algorithmen nur fehlschlagen oder viel langsamer laufen würden. In der Tat sind eingebettete Systeme nicht das einzige Ziel speichereffizienter Algorithmen: Beispielsweise gibt es Algorithmen , die den Cache nicht kennen und deren Verarbeitung anpasst, um den CPU-Cache effizient zu nutzen. Ein weiteres Beispiel: Einige Algorithmen für maschinelles Lernen für Big Data sind speziell auf diese Anforderungen zugeschnittenInkrementelles Lernen oder Out-of-Core-Computing zur Verarbeitung großer Datenmengen, die viel größer sind als der auf einem Computer verfügbare Speicher usw.

Es gibt auch Algorithmen, die nicht einen bestimmten Teil des Computers optimieren, sondern einen Standard, der von der Hardwarearchitektur abhängig ist. Beispielsweise werden numerische Daten, die Genauigkeit benötigen, in float oder double gespeichert, die aufgrund von Hardwarebeschränkungen naturgemäß eingeschränkt sind. Das Problem ist, dass komplexe Berechnungen zu Rundungen führen können. Je mehr Berechnungen Sie über gerundete Zahlen durchführen, desto mehr werden Sie davon abweichen. Dies wird als katastrophale Störung bezeichnet . Einige Anwendungen erfordern eine kritische Präzision, selbst auf Kosten der schlimmsten Komplexität. Für diese Art von Anwendungen wurden Algorithmen entwickelt, die ihre Berechnung optimieren, um katastrophale Störungen zu reduzieren oder zu beseitigen.

Das Entwerfen eines Algorithmus kann daher auch ein Kompromiss zwischen Abstraktion und Einschränkungen sein.

Am Ende können wir sagen, dass ein Algorithmus so abstrakt ist wie sein Ziel und wie seine vorausgesetzten (Architektur-) Bedürfnisse . Je spezifischer das Ziel Ihres Algorithmus ist, desto mehr wird er wahrscheinlich von der Hardwarearchitektur abhängen.

Einige verwandte Keywords, die Sie interessieren könnten:


1
Warum interessiert es die meisten Algorithmen, ob sie auf einer Von Neumann- oder einer Harvard-Architektur ausgeführt werden? Die meisten eingebetteten Systeme sind die letzteren, haben jedoch keine Probleme, die meisten Algorithmen auszuführen. Auch der Link zu "Cache-vergessener Architektur" wurde geschätzt, da ich den Begriff vorher nicht gehört hatte, aber ich denke nicht, dass der Satz korrekt ist. Soweit ich weiß, passen Cache-vergessene Algorithmen ihre Zugriffsmuster nicht an den Cache an. Im Gegenteil, sie verwenden Zugriffsmuster, die in fast jedem Cache gut funktionieren, sodass sie sich nicht darum kümmern müssen, wie der Cache funktioniert funktioniert.
Supercat

Vielleicht ist es gut zu beobachten, dass einige Algorithmen im Wesentlichen zufällig auf große Datenmengen zugreifen und auf fast jedem Cache schlecht funktionieren, einige lokalisierte Muster verwenden, die auf fast jedem Cache gut funktionieren, und einige auf die Arbeit mit gut zugeschnitten sein können Spezifische Cache-Architekturen weisen jedoch eine schlechte Leistung auf, wenn sie mit anderen verwendet werden.
Supercat

2

Sie sollten einen Algorithmus im Allgemeinen nicht mit mathematischen oder Rechenalgorithmen verwechseln. Wenn Sie Rechenalgorithmen meinen, ja, sie sind unabhängig von der Maschinenarchitektur.

Definition des Algorithmus aus Wikipedia:

In der Mathematik und Informatik ist ein Algorithmus eine in sich geschlossene, schrittweise auszuführende Gruppe von Operationen. Es gibt Algorithmen, die Berechnungen , Datenverarbeitung und automatisiertes Schließen durchführen.

Diese Definition wird verwendet, um auf einige geschlossene Berechnungs- oder Datenverarbeitungsaufgaben zu verweisen. Mit anderen Worten, Berechnungen, die abstrakt auf Turing Machine ausgeführt werden können . In jüngster Zeit gibt es in der Mathematik jedoch ein Konzept namens Interaktive Berechnung , das die Eingabe / Ausgabe-Kommunikation mit der Außenwelt während der Berechnung umfasst.

In einer allgemeinen Definition ist der Algorithmus nur ein Rezept (eine Folge von Anweisungen). Ich denke, Sie können sich keinen Algorithmus vorstellen, ohne den Befehlssatz oder die Operationen zu kennen, die Sie verwenden können. Bei mathematischen Operationen geht es um Berechnungen. Ein Algorithmus, der einen Schritt mit dem Namen " Aufheizen des Ofens " enthält, ist kein mathematischer Algorithmus. Sie können ihn jedoch einem Koch geben, der weiß, wie er ihn ausführt.

Dann können Sie eine Maschine erstellen, die X, Y, Z ... ausführen kann. Jedes dieser Elemente kann in Ihrem Algorithmus als Anweisung verwendet werden. Wenn es sich jedoch nur um geschlossene Berechnungen handelt (in der Tat nicht interaktive deterministische digitale Kleinschrittberechnungen), kann man beweisen, dass Ihre Maschine Turing Machine entspricht . Wenn Sie sich jedoch auf andere Arten von Berechnungen (Fortsetzung von Werten oder interaktive Berechnungen [ich bin mir jedoch nicht sicher, ob es sich wirklich um eine andere Art von Berechnung handelt]) oder gar nicht-rechnerische Aufgaben konzentrieren, können Sie sich Maschinen vorstellen, die diese ausführen können.

Diese Frage und Antwort ist auch interessant, um eine breitere Perspektive auf Algorithmen zu erhalten.


1

Im Allgemeinen sind Algorithmen auf bestimmte Probleme ausgelegt, während ein gewisses Maß an "Kosten" minimiert wird. In der Vergangenheit wurden viele Algorithmen unter der Annahme entworfen, dass die relativen Kosten für gemeinsame Vorgänge auf vielen Architekturen relativ ähnlich wären, und daher würden einige typische Maschinen einen Algorithmus ausführen, der besser als der andere wäre, als auf den meisten typischen Maschinen, auf denen der frühere Algorithmus ausgeführt würde Schlimmstenfalls nur geringfügig unterlegen sein. Mit der Zeit gilt eine solche Annahme nicht mehr so ​​gut wie früher.

Früher war es beispielsweise so, dass die Häufigkeit, mit der ein Programm Daten aus dem Speicher lesen musste, wichtiger war als die Position der zu lesenden Daten. Das Lesen von Dingen, die in der Erinnerung nahe beieinander lagen, war etwas billiger als das Lesen von Dingen, die weit auseinander lagen, aber nicht unverschämt auffallen. Da die Geschwindigkeit der Haupt-CPU mit einer Geschwindigkeit angestiegen ist, die die Speichergeschwindigkeit weit übersteigt, hat die Bedeutung der Zugriffsfolge jedoch erheblich zugenommen. Es ist möglich, dass ein Programm zehnmal so viele Anweisungen ausführt wie ein anderes und dennoch schneller ausgeführt wird, wenn die 95% der Speicherabrufe des ersteren Programms L1-Cache-Treffer und die Mehrheit der Speicherabrufe des letzteren Programms Cache-Fehlschläge erzeugen.

Darüber hinaus treffen bestimmte Arten von Algorithmen im Zusammenhang mit der Parallelität verschiedene Annahmen darüber, wann Daten, die von einem Prozessorkern in den Speicher geschrieben werden, von anderen Kernen "gesehen" werden. Viele Prozessoren haben verschiedene Möglichkeiten, Speicher zu lesen und zu schreiben, wobei die Kosten variieren und die Sichtbarkeit garantiert wird. Einige Algorithmen funktionieren sehr gut auf Architekturen, die die Sichtbarkeitsanforderungen "kostenlos" erfüllen können, andere jedoch nur schlecht, wenn die für diese Garantien erforderlichen Anweisungen teuer sind. In der Tat konnte bei einigen Architekturen nur durch Beschränkung der Ausführung auf einen einzigen zeitlich gemeinsam genutzten CPU-Kern sichergestellt werden, dass bestimmte Algorithmen, die sich auf die Parallelität beziehen, funktionieren (was natürlich den Sinn der Verwendung eines parallelen Algorithmus zunichte machen würde).


1

Vielen Antworten fehlt die Tatsache, dass ein Algorithmus in Begriffen definiert werden kann, die entweder abstrakt oder in direkter, wörtlicher Beziehung zu einer Architektur stehen. Ein Algorithmus muss eindeutig sein, aber es gibt immer noch Raum, mehr oder weniger spezifisch zu sein.

Ein Algorithmus zum Konvertieren einer Zeichenfolge in Großbuchstaben kann einfach in einem Pseudocode beschrieben werden, der architekturunabhängig ist. Gleichzeitig hindert Sie nichts daran, einen Algorithmus für die Konvertierung eines Strings in All-Caps speziell für eine x86-Architektur zu beschreiben. Alles was es braucht ist eine x86 Assembly Hausaufgabe. (Sie können dies immer noch im Pseudocode tun - nur im Pseudocode, der sich auf diese Architektur bezieht!) Die Tatsache, dass das Problem speziell auf eine x86-Architektur zutrifft, bedeutet nicht, dass Sie keinen Algorithmus mehr haben, um es zu lösen.

Dies hängt von dem Problem ab, das der Algorithmus lösen soll. Der Algorithmus ist architekturunabhängig, wenn das von ihm gelöste Problem architekturunabhängig ist (und vorausgesetzt, dass dies nicht durch die Art und Weise, wie der Algorithmus beschrieben oder zusammengestellt wird, rückgängig gemacht wird). Das Problem kann entweder ein theoretisches Problem sein, ein Problem an der Tafel, oder es kann sich um eine sehr spezifische Architektur handeln. Im letzteren Fall wäre der Algorithmus wiederum auf die Arbeit mit dieser Architektur beschränkt.


1

Algorithmen sind eine Folge von Schritten. Sie hängen nicht davon ab, was sie ausführt (oder nicht).

Die zeitliche Komplexität eines Algorithmus kann jedoch davon abhängen, was er ausführt. Aus diesem Grund erfordert eine detaillierte Analyse eines Algorithmus ein "Rechenmodell", beispielsweise eine Maschine mit wahlfreiem Zugriff .
Ob auf den Speicher zufällig zugegriffen werden kann oder nicht, hängt sicherlich davon ab, wie lange die Ausführung Ihres Algorithmus dauert. Die meisten Algorithmen gehen davon aus, dass dies der Fall ist, wohingegen in Wirklichkeit die meisten Architekturen diese Bedingung nicht erfüllen.


0

Sie unterscheiden sich in unterschiedlichen Zusammenhängen der Probleme. Algorithmus ist die Sammlung von Schritten zur Lösung eines Problems. Der Kontext dieses Problems kann theoretisch alles sein. Daher kann der Algorithmus zur Lösung des Problems buchstäblich von allem abhängig sein, was wir uns vom Universum vorstellen können. Lassen Sie mich mit einem Beispiel verdeutlichen. Nehmen wir an, Sie haben die Aufgabe,

Erstellen Sie einen Algorithmus, der die Lasten auf mehrere Kerne verteilt, wenn mehrere Kerne verfügbar sind.

Können Sie sich vorstellen, dass Ihr Algorithmus von der Architektur abhängt oder nicht? Natürlich ja .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.