2016-08-06 1 views
0

Savez-vous comment puis-je concevoir le même concept que celui utilisé par gsl pour permettre aux utilisateurs de basculer entre différentes implémentations cblas? AFAIK, la dépendance de cblas dont dépend gsl aurait dû être codée en dur dans la bibliothèque gsl quand gsl a été compilé.Comment exactement gsl atteint fonctionnalité de liaison cblas alternative?

2.2.2 Liaison avec une alternative de la bibliothèque BLAS

La ligne de commande suivante montre comment vous relier la même application avec une bibliothèque CBLAS alternatif libcblas.a,

$ gcc example.o -lgsl -lcblas -lm 

Pour la Meilleure performance Une bibliothèque CBLAS spécifique à la plate-forme optimisée doit être utilisée pour -lcblas. La bibliothèque doit être conforme à la norme CBLAS . Le paquet ATLAS fournit une bibliothèque portable haute performance BLAS avec une interface CBLAS. Il s'agit d'un logiciel libre qui doit être installé pour tout travail nécessitant des opérations vectorielles et matricielles rapides. La ligne de commande suivante lien avec la bibliothèque ATLAS et son Interface CBLAS,

$ gcc example.o -lgsl -lcblas -latlas -lm 

Si la bibliothèque ATLAS est installé dans un répertoire non standard utiliser l'option -L pour l'ajouter au chemin de recherche, comme décrit ci-dessus.

Pour plus d'informations sur les fonctions BLAS, voir le support BLAS.

Répondre

-1

Blas bibliothèque

gcc -c -Wall -Werror -fpic blas.cpp 

gcc -shared -o libblas.so blas.o 

bibliothèque GSL, qui utilise réellement blas mais nous ne relions pas à elle

gcc -c -Wall -Werror -fpic gsl.cpp 

gcc -shared -o libgsl.so gsl.o 

Exemple application qui lie simultanément à gsl et blas

gcc -Wall -o main main.cpp -L../mygsl -lgsl -L../mycblas -lblas 
1

Il n'y a pas de concept particulier ici - juste plusieurs bibliothèques implémentant la même API et ayant le même ABI. En d'autres termes, vous écrivez un programme utilisant la fonction int do_stuff(char*) de #include foo.h. Libfoo.so est un objet de bibliothèque partagée qui exporte le symbole int do_stuff(char*), car il a été généré à partir d'un programme qui contient une implémentation de int do_stuff(char*).

Si vous écrivez maintenant une deuxième bibliothèque qui implémente tous les mêmes symboles que libfoo, alors vous avez quelque chose que vous pouvez utiliser à la place de libfoo.

C'est tout ce qui se passe ici. GSL utilise des symboles BLAS. BLAS définit exactement ce que sont ces symboles (lire: leur signature de fonction C), de sorte que vous pouvez utiliser n'importe quelle implémentation BLAS souhaitée. (En supposant que tout a été construit avec des compilateurs/linkers compatibles)

+0

Oui, vous ont raison. J'étais un peu confus comment construire la bibliothèque de gsl sans lier explicitement à la bibliothèque de blas et en la reportant au temps de construction d'application. J'ai fait un test rapide pour vérifier votre demande et cela fonctionne. Merci. –