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

mrg*_*oom 10 c++ linux blas openblas caffe

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

Sev*_*eux 7

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

update-alternatives --config libblas.so.3
Run Code Online (Sandbox Code Playgroud)

您将获得编号的备选列表,并可以轻松地在它们之间切换

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


zti*_*tik 5

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

例如,如果您安装Atlas (sudo 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
Run Code Online (Sandbox Code Playgroud)

安装Openblas(sudo 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
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用自己的软链接来构建库.


pau*_*l-g 5

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

例如,你可以运行

LD_PRELOAD=/path/to/blas/lib.so ./my_executable_using_caffe
Run Code Online (Sandbox Code Playgroud)

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

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