是否可以在不重新编译程序的情况下在BLAS库之间切换?

例如,我可以同时在我的Ubuntu 14.04上安装Atlas , OpenBlas , MKL ,并在它们之间切换而不用重新编译Caffe ?

Solutions Collecting From Web of "是否可以在不重新编译程序的情况下在BLAS库之间切换?"

当然,你必须安装它们,并在Ubuntu / Debian问题命令

update-alternatives --config libblas.so.3 

你会得到编号列表的替代品,并可以轻松地在它们之间切换

链接: https : //wiki.debian.org/DebianScience/LinearAlgebraLibraries

是的你可以。 你只需要使用动态库链接。 libblas.so.3是一个到/etc/alternatives/libblas.so.3的软链接,它又指向BLAS库的实现

例如,如果你安装Atlassudo apt-get install libatlas3-base ):

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

而在安装Openblassudo apt-get install libopenblas-base ):

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

当然,你可以使用自己的软链接到你的图书馆版本。

您也可以在不更改系统范围设置的情况下执行此操作,例如,将要使用的库添加到LD_PRELOADLD_LIBRARY_PATH环境变量中。 此路径上的第一个库将是用于解析符号的库。

例如,你可以运行

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

您可以看到,作为不同实现的基准脚本的一部分,这种方法将非常有用,因为它不会影响基准测试环境本身。 例如(在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 

这种基于动态链接的方法适用于您的程序所编译的任何其他共享库