2015-11-23 12 views
7

Zum Beispiel kann ich Atlas, OpenBlas, MKL auf meinem Ubuntu 14.04 zur gleichen Zeit installiert haben und zwischen ihnen ohne Neukompilierung Caffe wechseln?Ist es möglich, zwischen BLAS-Bibliotheken zu wechseln, ohne das Programm neu zu kompilieren?

+2

@Shai, um verschiedene BLAS-Bibliotheken mit Caffe zu benchmarken. – mrgloom

+0

das ist eine interessante Aufgabe. Wenn Sie irgendwelche Schlussfolgerungen ziehen, wäre es schön, wenn Sie sie hier teilen. – Shai

Antwort

6

Sicher, haben Sie sie installiert haben, und auf Ubuntu/Debian Ausgabe Befehl

update-alternatives --config libblas.so.3 

Sie werden Liste von Alternativen und nummeriert leicht

Verbindung zwischen ihnen hin- und herschalten könnte: https://wiki.debian.org/DebianScience/LinearAlgebraLibraries

+0

Eine andere Frage, was passiert, wenn ich OpenBlas auf normale Weise und mit dem Flag USE_OPENMP = 1 erstelle? Kann ich zwischen ihnen wechseln? d. h. kann ich zwischen Bibliotheksmodifikationen/-versionen wechseln? – mrgloom

+0

@mrgloom ja, aber sie sollten verschiedene Pakete sein, die die gleiche Alternative bieten. Dann wird 'update-alternatives' über sie wissen –

+0

Aber wie kann ich sie als mehrere Pakete bauen?Zum Beispiel, wenn ich OpenBlas von Quelle über 'make' und dann' make install PREFIX = dein_Installationsverzeichnis1' baue und dann mit 'make USE_OPENMP = 1' und' make install PREFIX = dein_Installationsverzeichnis2' versuch, kann 'update-alternatives' meine Builds finden in diesen Ordnern oder wie kann ich zwei verschiedene Builds der gleichen lib im ubuntu Standard lib Verzeichnis mit 'make install' installieren? – mrgloom

5

Ja, Sie können. Sie müssen nur dynamische Bibliotheksverknüpfung verwenden. Die libblas.so.3 ist eine weiche Anbindung an /etc/alternatives/libblas.so.3 Was wiederum zeigt auf die BLAS Bibliothek Implementierung

Zum Beispiel, wenn Sie Atlas (sudo apt-get install libatlas3-base) installieren:

/usr/lib/libblas.so.3 -> /etc/alternatives/libblas.so.3 
/etc/alternatives/libblas.so.3 -> /usr/lib/atlas-base/atlas/libblas.so.3 

während nach Openblas (sudo apt-get install libopenblas-base) installieren:

/usr/lib/libblas.so.3 -> /etc/alternatives/libblas.so.3 
/etc/alternatives/libblas.so.3 -> /usr/lib/openblas-base/libblas.so.3 

Natürlich können Sie Ihren eigenen weichen Link zu Ihrem verwenden Bibliothek erstellt.

+0

'ldconfig -p' gibt mir' libblas.so.3gf (libc6, x86-64) =>/usr/lib/libblas.so.3gf' und \t 'libblas.so (libc6, x86-64) =>/usr/lib/libblas.so' was ist 'libblas.so.3' kannst du das näher ausführen? – mrgloom

+0

@mrgloom Können Sie auflisten, welche Blas-Pakete installiert sind? – ztik

5

Sie können dies auch tun, ohne die systemweiten Einstellungen zu ändern, z. B. indem Sie die gewünschte Bibliothek zu den Umgebungsvariablen LD_PRELOAD oder LD_LIBRARY_PATH hinzufügen. Die erste Bibliothek auf diesem Pfad ist diejenige, mit der die Symbole aufgelöst werden.

Zum Beispiel könnten Sie mit

LD_PRELOAD=/path/to/blas/lib.so ./my_executable_using_caffe 

ausführen können Sie sehen, dass dieser Ansatz im Rahmen eines Benchmarking-Skripts für verschiedene Implementierungen äußerst nützlich wäre, da er nicht die Benchmark-Umgebung selbst nicht beeinträchtigt. Zum Beispiel (in bash):

my_libraries=/path/to/blas1.so /path/to/blas2.so 

for lib in $my_libraries 
do 
    LD_PRELOAD=${lib} ./my_executable_using_caffe 
done 

Dieser Ansatz basierte auf dynamische Verknüpfung, gilt für jeden anderen Shared Library Ihr Programm gegen kompiliert wird.