Was bedeutet statische, dynamische und einzelne dynamische Verknüpfung?

9

Ich verwende Intel MKL für BLAS und den Intel MKL Link Line Advisor, um Hilfe bei den Befehlszeilenoptionen zu erhalten.

Der Advisor bietet Optionen für die statische, dynamische und einzelne dynamische Bibliothek. Was bedeuten diese Begriffe?

Es gab diesbezüglich zahlreiche Beiträge zu SO, aber alle konzentrierten sich eher auf die Entwicklung von Software als auf wissenschaftliche / mathematische Codes. ( Dieser war besonders nützlich)

  • Wie sind diese Begriffe für Parallel Computing relevant?
  • Ist einer "besser" als der andere? (Ich weiß, dass das Bessere genauer definiert werden müsste, aber ich weiß noch nicht, wie es geht)
  • Was wird häufiger verwendet und warum?
  • Was muss der Programmierer beim Verknüpfen beachten?
Anfrage
quelle
Nur als Hinweis, wenn Sie es nicht gesehen haben, bieten die neueren Intel-Compiler (ich denke Version 11 und neuer) das -mklFlag, das die Verwendung des Link Line Advisor in den meisten Fällen überflüssig machen sollte.
Aesin
@ Aesin, ich habe mich gefragt. Ist es die optimalste Art der Verknüpfung?
Untersuchung
Ich weiß es leider nicht - ich habe keine Tests durchgeführt und das Handbuch geht nicht detailliert darauf ein, was es tut oder wie es mit anderen Optionen kombiniert wird. Es verknüpft MKL statisch, wenn Sie es angeben, -staticund verknüpft es dynamisch, wenn Sie dies nicht tun. Unter dem Gesichtspunkt der Benutzerfreundlichkeit ist es auf jeden Fall viel besser.
Aesin

Antworten:

14

Die Begriffe statische Verknüpfung und dynamische Verknüpfung stehen nicht in direktem Zusammenhang mit parallelem Rechnen, obwohl seit einiger Zeit bekannt ist, dass das dynamische Laden (im Gegensatz zum Laden einer statisch kompilierten ausführbaren Datei) auf Netzwerkdateisystemen aufgrund der hohen Kapazität nicht gut skaliert werden kann Laden von Metadaten durch den dynamischen Loader, der Ladepfade nach Zielbibliotheken durchsucht.

Es ist schwierig, allgemeine Aussagen darüber zu treffen, ob statische oder dynamische Bibliotheken im Hochleistungsrechnen besser sind. Für die meisten Supercomputer-Anwendungen ist es sicherlich einfacher und bevorzugt, statisch zu verknüpfen. Warum ist das? Bei der aktuellen Generation von Supercomputern wird normalerweise nur ein Job pro Knoten ausgeführt, wodurch die Vorteile eines verringerten Speicherverbrauchs aufgrund gemeinsam genutzter Bibliotheken erheblich reduziert werden. Darüber hinaus sind wissenschaftliche Computercodes in Bezug auf Sprachfunktionen oder Programmdesign in der Regel nicht sehr ausgefeilt und verwenden nur selten Sprachfunktionen, die dynamisch geladen werden müssen (z. B. Plugin-Module). Dynamische Bibliotheken haben die zusätzliche Schwierigkeit, unter Betriebssystemen viel weniger portabel zu sein als statische Bibliotheken.

Infolgedessen verwenden die meisten HPC-Systeme eine statische Kompilierung, sofern verfügbar. Statische Bibliotheken werden als schneller, einfacher zu installieren und zu warten und im Allgemeinen robuster angesehen. HPC-Codes, die auf Python basieren, sind eine der Ausnahmen, aber sie unterliegen immer noch den Leistungsproblemen, die mit dem dynamischen Laden verbunden sind (mehrere Benutzer von scicomp arbeiten gerade an diesem Problem!).

Wenn Sie sich für statische oder dynamische Verknüpfungen entscheiden, müssen Sie berücksichtigen, wie und wo Ihr Code bereitgestellt wird, ob sich die zugrunde liegenden Bibliotheken wahrscheinlich ändern oder verschieben und welche Leistungsmerkmale Ihr Netzwerkdateisystem aufweist. Sie sollten auch prüfen, ob Sie eine dynamische Verknüpfung benötigen , entweder durch eine Bibliotheksabhängigkeit oder um mit einer dynamischen Skriptsprache wie Python zusammenzuarbeiten.

Single Dynamic Library ist ein Intel-spezifischer Begriff. Es bezieht sich auf das Packen ihrer dynamischen Bibliotheken in eine einzelne Metabibliothek, um den Verknüpfungsprozess zu vereinfachen. Wenn Sie eine dynamische Verknüpfung mit Intel-Bibliotheken verwenden, wird dieses Formular wahrscheinlich bevorzugt, es sei denn, Sie tun etwas Kompliziertes.

Aron Ahmadia
quelle
Hervorragende Antwort! Nur noch eine Sache: Mir ist klar, dass eine dynamische Verknüpfung unnötig wäre und die Wahl zwischen statischer und einzelner Dynamik getroffen wird. Sie sagen, ich sollte Letzteres wählen, es sei denn, ich mache etwas Kompliziertes (was ich nicht bin). Soll ich also mit Single Dynamic verlinken? [FWiW, ich arbeite an Krylov Subspace Methoden]
Inquest
Es tut uns leid! Ich meinte, Sie sollten standardmäßig statisch verwenden, aber einzelne dynamische gegenüber dynamischen bevorzugen.
Aron Ahmadia
Ich habe ein Benchmarking durchgeführt und festgestellt: Dynamic : 0:42.92 Static : 0:42.93 Single Dynamic : 0:42.97gemittelt über 1000 Werte.
Untersuchung
1
Es ist erwähnenswert, dass auf einigen HPC-Systemen eine statische Verknüpfung erforderlich ist. Auf den BlueGene / L-Systemen ist dies beispielsweise der Fall, weil das reduzierte Betriebssystem auf den Rechenknoten keine dynamische Verknüpfung unterstützt.
Aesin
1
Ihre Aussage verwirrt mich ein wenig: "Bei der aktuellen Generation von Supercomputern wird normalerweise nur ein Job pro Knoten ausgeführt, was die Vorteile eines geringeren Speicherverbrauchs aufgrund gemeinsam genutzter Bibliotheken erheblich verringert." Wollten Sie sagen, dass es nur einen Prozess pro Knoten gibt? Ich bin nicht sicher, wie sich ein Job pro Knoten auf die Situation auswirkt. Bei der statischen Verknüpfung speichert jeder Prozess eine vollständige Kopie der ausführbaren Datei, was von Bedeutung sein kann, wenn die Kerne pro Prozessor wachsen. Für die dynamische Verknüpfung ist nur eine Kopie der dynamischen Bibliothek pro gemeinsam genutztem Speicherplatz erforderlich.
Andybauer