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

Is it possible to switch between BLAS libraries without recompiling program?

例如我可以Atlas, OpenBlas, MKL installed on my Ubuntu 14.04 at the same time and switch between them without recompiling Caffe吗?

是的,你可以。你只需要使用动态库linking。 libblas.so.3 是软 linking 到 /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

安装后 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

当然,您可以使用自己的软件 link 构建您的库。

当然,您必须安装它们,然后在 Ubuntu/Debian 上发出命令

update-alternatives --config libblas.so.3

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

Link: https://wiki.debian.org/DebianScience/LinearAlgebraLibraries

您也可以在不更改系统范围设置的情况下执行此操作,例如将您要使用的库添加到 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

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