Cosa significano collegamenti statici, dinamici e dinamici singoli?


9

Uso Intel MKL per BLAS e utilizzo Intel MKL Link Line Advisor per assistenza con le opzioni della riga di comando.

L'advisor fornisce opzioni per la libreria statica, dinamica e singola dinamica. Cosa significano questi termini?

Ci sono stati numerosi post su SO riguardo a questo, ma tutti si sono concentrati sullo sviluppo di software piuttosto che su codici scientifici / matematici. ( Questo è stato particolarmente utile)

  • In che modo questi termini sono rilevanti per il Parallel Computing?
  • Uno è "migliore" dell'altro? (So ​​che il meglio dovrebbe essere definito in modo più preciso, ma non so come al momento)
  • Cosa viene usato più comunemente e perché?
  • Cosa deve considerare il programmatore durante il collegamento?

Proprio come una nota, se non l'hai visto, i compilatori Intel più recenti (penso che la versione 11 e più recenti) forniscano il -mklflag che dovrebbe rimuovere la necessità di utilizzare il consulente di linea di collegamento nella maggior parte dei casi.
Aesin,

@Aesin, mi stavo chiedendo. È il modo più ottimale di collegamento?
Inchiesta il

Sfortunatamente non lo so - non ho ancora fatto alcun test e il manuale non fornisce alcun dettaglio su ciò che sta facendo o su come si combina con altre opzioni. Collega staticamente MKL se lo specifichi -statice, se non lo fai, lo collega dinamicamente. È sicuramente molto meglio dal punto di vista della facilità d'uso, in ogni caso.
Aesin,

Risposte:


14

I termini collegamento statico e collegamento dinamico non sono direttamente correlati al calcolo parallelo, sebbene sia noto da tempo che il caricamento dinamico (al contrario del caricamento di un eseguibile compilato staticamente) non si adatta bene ai file system di rete a causa del pesante carico di metadati causato dal caricatore dinamico che cerca percorsi di carico per le librerie di destinazione.

È difficile fare affermazioni generali sul fatto che le librerie statiche o dinamiche siano migliori nel calcolo ad alte prestazioni. Certamente per la maggior parte delle applicazioni di supercalcolo, è più semplice e preferisce il collegamento statico. Perchè è questo? Nell'attuale generazione di supercomputer, di solito esiste un solo lavoro in esecuzione per nodo, il che riduce fortemente i vantaggi di un ridotto consumo di memoria dovuto alle librerie condivise. Inoltre, i codici scientifici informatici tendono a non essere molto sofisticati in termini di funzionalità linguistiche o di progettazione del programma e raramente fanno uso di funzionalità linguistiche che richiedono un caricamento dinamico (come i moduli plug-in). Le librerie dinamiche hanno l'ulteriore difficoltà di essere molto meno portatili tra i sistemi operativi rispetto alle librerie statiche.

Di conseguenza, la maggior parte dei sistemi HPC utilizza la compilazione statica quando disponibile. Le librerie statiche sono considerate più veloci, più facili da installare e mantenere e generalmente più robuste. I codici HPC basati su Python sono una delle eccezioni a questo, ma sono ancora soggetti ai problemi di prestazioni associati al caricamento dinamico (diversi utenti su scicomp stanno attualmente lavorando a questo problema!).

Quando si sceglie il collegamento statico rispetto a quello dinamico, è necessario considerare come e dove verrà distribuito il codice, se è probabile che le librerie sottostanti possano cambiare o spostarsi e le caratteristiche di prestazione del file system di rete. Dovresti anche valutare se hai bisogno di un collegamento dinamico, attraverso una dipendenza dalla libreria o per interagire con un linguaggio di script dinamico come Python.

Single Dynamic Library è un termine specifico di Intel. Si riferisce al raggruppamento delle loro librerie dinamiche in un'unica meta-biblioteca per semplificare il processo di collegamento. Se utilizzerai il collegamento dinamico con le librerie Intel, questo modulo è probabilmente preferito a meno che tu non stia facendo qualcosa di complicato.


Risposta eccellente! Ancora un'altra cosa: mi rendo conto che il collegamento dinamico non sarebbe necessario e la scelta sarà tra statica e singola dinamica. Dici che dovrei scegliere quest'ultimo a meno che non stia facendo qualcosa di complicato (cosa che non sto facendo). Quindi, dovrei collegarmi usando Single Dynamic? [FWiW, sto lavorando su Krylov Subspace Methods]
Inchiesta il

Scusate! Volevo dire che dovresti usare static per impostazione predefinita, ma preferisci single dynamic piuttosto che dinamico.
Aron Ahmadia,

Ho fatto alcuni benchmarking e ho scoperto: una Dynamic : 0:42.92 Static : 0:42.93 Single Dynamic : 0:42.97media di oltre 1000 valori.
Inquiry

1
Vale la pena notare che su alcuni sistemi HPC è necessario collegarsi staticamente - sui sistemi BlueGene / L questo è il caso, ad esempio, perché il sistema operativo ridotto sui nodi di calcolo non supporta il collegamento dinamico.
Aesin,

1
Sono un po 'confuso dalla tua affermazione: "Sull'attuale generazione di supercomputer, di solito esiste un solo lavoro in esecuzione per nodo, il che riduce fortemente i vantaggi di un ridotto consumo di memoria dovuto alle librerie condivise". Intendevi dire che esiste un solo processo per nodo? Non sono sicuro di come un lavoro per nodo influisca sulla situazione. Quando si collega staticamente ogni processo memorizzerà una copia completa dell'eseguibile che può essere significativa con la crescita dei core per processore. Il collegamento dinamico richiederà solo una copia della libreria dinamica per spazio di memoria condivisa.
Andybauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.