【问题标题】:Is it possible to switch between BLAS libraries without recompiling program?是否可以在不重新编译程序的情况下在 BLAS 库之间切换?
【发布时间】:2015-11-23 14:17:37
【问题描述】:

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

【问题讨论】:

  • @Shai 用 Caffe 对不同的 BLAS 库进行基准测试。
  • 这是一项有趣的任务。如果您得出任何结论,最好在这里分享。

标签: c++ linux blas caffe openblas


【解决方案1】:

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

update-alternatives --config libblas.so.3

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

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

【讨论】:

  • 另一个问题如果我以普通方式构建 OpenBlas 并带有标志 USE_OPENMP=1 怎么办?我可以在它们之间切换吗?即我可以在库修改/版本之间切换吗?
  • @mrgloom 是的,但它们应该是不同的包,提供相同的替代方案。然后update-alternatives会知道他们
  • 但是如何将它们构建为多个包?例如,如果我通过 make 从源代码构建 OpenBlas,然后通过 make install PREFIX=your_installation_directory1 编译,然后使用 make USE_OPENMP=1make install PREFIX=your_installation_directory2 编译,update-alternatives 可以在此文件夹中找到我的构建,或者我如何安装两个不同的构建通过 make install 在 ubuntu 的默认 lib 目录中使用相同的 lib?
  • @mrgloom 不,我说的是 Debian/Ubuntu .deb 包。最好的方法是下载 debian 源码包,修改它并重建。在此处查看说明wiki.debian.org/BuildingAPackage
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    是的,你可以。您只需要使用动态库链接。 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
    

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

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

    【讨论】:

    • ldconfig -p 给我libblas.so.3gf (libc6,x86-64) => /usr/lib/libblas.so.3gflibblas.so (libc6,x86-64) => /usr/lib/libblas.so 什么是libblas.so.3 你能详细说明一下吗?
    • @mrgloom 你能列出安装了哪些 blas 包吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多