标签: openblas

为什么numpy.dot比numpy.einsum快得多?

我用OpenBlas编译了numpy,我想知道为什么einsum比dot慢得多(我理解在3个索引的情况下,但我不明白为什么它在两个索引情况下的性能也不太好)?这是一个例子:

import numpy as np
A = np.random.random([1000,1000])
B = np.random.random([1000,1000])

%timeit np.dot(A,B)

Out: 10 loops, best of 3: 26.3 ms per loop

%timeit np.einsum("ij,jk",A,B)

Out: 5 loops, best of 3: 477 ms per loop
Run Code Online (Sandbox Code Playgroud)

有没有办法让einsum使用OpenBlas和numpy.dot这样的并行化?为什么np.einsum不只是在注意到点积时调用np.dot?

python numpy linear-algebra openblas

5
推荐指数
1
解决办法
1381
查看次数

"/ usr/bin/ld:在Caffe编译中找不到-lopenblas"错误

当我编译Caffe时,我遇到了这个错误,尽管安装了OpenBLAS:

AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so
/usr/bin/ld: cannot find -lopenblas
collect2: ld devolvió el estado de salida 1
make: *** [.build_release/lib/libcaffe.so] Error 1
Run Code Online (Sandbox Code Playgroud)

有解决方案吗?

openblas caffe

5
推荐指数
2
解决办法
1万
查看次数

尝试在 redhat 上使用 Atlas/OpenBLAS 运行 R

两天来,我一直在尝试使用 Lapack 安装 Openblas/atlas 并在 R 中使用它。这让我发疯了。我已经到了无法再思考的地步。

我的服务器使用:
Red Hat Enterprise Linux Server 6.6 版(圣地亚哥)

这是我到目前为止安装的内容:

[root@tpdb05 atlas]# yum install atlas.x86_64 blas.x86_64 lapack.x86_64 Loaded plugins: product-id, refresh-packagekit, rhnplugin, security, subscription-manager
    Setting up Install Process
    Package atlas-3.8.4-2.el6.x86_64 already installed and latest version
    Package blas-3.2.1-4.el6.x86_64 already installed and latest version
    Package lapack-3.2.1-4.el6.x86_64 already installed and latest version
[root@tpdb05 ruser]#


yum install lapack.i686
    Installed:
    lapack.i686 0:3.2.1-4.el6

    Dependency Installed:
    blas.i686 0:3.2.1-4.el6                          glibc.i686 0:2.12-1.166.el6_7.3        libgfortran.i686 0:4.4.7-16.el6
    nss-softokn-freebl.i686 0:3.14.3-23.el6_7

    Dependency Updated:
    glibc.x86_64 0:2.12-1.166.el6_7.3         glibc-common.x86_64 0:2.12-1.166.el6_7.3    glibc-devel.x86_64 …
Run Code Online (Sandbox Code Playgroud)

installation redhat r atlas openblas

5
推荐指数
0
解决办法
897
查看次数

为什么R即使后来使用--with-blas = lblas`构建后也可以链接到共享的BLAS?

R安装和管理手册中BLAS部分说,当使用配置参数从源代码构建R时--without-blas,它将把Netlib的参考BLAS R_HOME/lib/libRblas.so与标准R共享库一起构建到一个独立的共享库中R_HOME/lib/libR.so。这使用户可以更轻松地在R环境中切换和基准化不同的调谐BLAS。该指南建议研究人员可以使用符号链接来libRblas.so实现此目的,本文对此提供更多详细信息。

相反,从R CRAN的镜像或Ubuntu的存储库(对于像我这样的Linux用户)简单地安装R的预编译二进制版本时,从理论上讲不重建R的情况下在不同的BLAS之间进行切换应该更困难,因为编译的R版本配置为--with-blas = (some blas library)。我们可以通过读取处的配置文件R_HOME/etc/Makeconf或查看的结果来轻松地进行检查R CMD config BLAS_LIBS。例如,在我的机器上,它返回-lblas,因此它在构建时链接到参考BLAS 。结果,没有R_HOME/lib/libRblas.so,只有R_HOME/lib/libR.so

但是,此R-blog表示,即使未从源代码安装R,也可以在BLAS之间进行切换。作者从ubuntu的存储库中尝试了ATLAS和OpenBLAS,然后使用update-alternatives --config来解决。也可以从源代码配置和安装经过调整的BLAS,通过将它们添加到“替代项”中update-alternatives --install,然后以相同的方式在它们之间进行切换。这种情况下的BLAS库(符号链接)位于/usr/lib/libblas.so.3ubuntu和R's下LD_LIBRARY_PATH。我已经测试过了,这确实可行!但是我很惊讶R如何做到这一点。 如我所说,R应该已经绑定到在构建时配置的BLAS库,即,我希望所有BLAS例程都集成到R_HOME/lib/libR.so。那么,为什么仍然可以通过更改BLAS /usr/lib/libblas.so.3

谢谢,如果有人可以解释一下。

ubuntu r blas openblas

5
推荐指数
0
解决办法
3914
查看次数

在 CentOS / Fedora 上安装 OpenBLAS

在一个Java项目中,我使用matrix-toolkits-java (MTJ)来进行高效的矩阵乘法。这依赖于netlib-java,而 netlib-java 又依赖于计算机上安装的 BLAS 和 LAPACK 的优化实现。它专门寻找/usr/lib64/libblas.so.3/usr/lib64/liblapack.so.3找到这些库。

blas通过Yum安装时lapack,我们会获得符号链接/usr/lib64/libblas.so.3/usr/lib64/liblapack.so.3指向引用中的 .so 文件blaslapack通过 Yum 安装。

现在我们想要使用比参考更快的实现,在我的例子中是OpenBLAS。无论我是自己编译还是通过 Yum 安装它,我最终都会得到/usr/lib64/libopenblas-r0.2.18.so.

现在,根据互联网上的任何指南,我应该用 OpenBLAS 实现的符号链接替换参考实现的符号链接,最终得到如下结果:

libblas.so.3 -> libopenblas-r0.2.18.so
liblapack.so.3 -> libopenblas-r0.2.18.so
Run Code Online (Sandbox Code Playgroud)

好吧,我能做到!我可以使用ln或 via 来做到这一点alternatives。如果我这样做,我的代码就会愉快地使用快速的 OpenBLAS。

然而,当ldconfig运行时,我很棒的符号链接消失了,它们被参考 BLAS 和 LAPACK 安装覆盖。然后我的软件又变得悲伤和缓慢。

所以我的问题是,如何在CentOS/Fedora上安装OpenBLAS,并且运行时ldconfig不会破坏它?我无法删除blaslapack软件包,因为主机的其他客户端可能依赖它。blas相反,我会以某种方式让操作系统了解 OpenBLAS 是和的直接替代品lapack

centos rpm blas mtj openblas

5
推荐指数
1
解决办法
7763
查看次数

Numpy 点运算未使用所有 cpu 核心

  • 我正在对两个矩阵进行 numpy 点积(假设 a 和 b 是两个矩阵)。

  • 当 a 的形状为 (10000, 10000) 且 b 的形状为 (1, 10000) 时,numpy.dot(a, bT) 正在使用所有 CPU 核心。

  • 但是,当 a 的形状为 (10000, 10000) 且 b 的形状为 (2, 10000) 时,numpy.dot(a, bT) 不会使用所有 CPU 核心(仅使用一个)。

当 b 的行大小从 2 到 15(即从 (2, 10000) 到 (15, 10000))时,就会发生这种情况。

例子:

import numpy as np

a = np.random.rand(10**4, 10**4)

def dot(a, b_row_size):
    b = np.random.rand(b_row_size, 10**4)

    for i in range(10):
        # dot operation
        x = np.dot(a, b.T)

# Using all CPU cores …
Run Code Online (Sandbox Code Playgroud)

python numpy openblas python-3.5

5
推荐指数
1
解决办法
4695
查看次数

CMake、.dll、.dll.a 与 .a:我应该在 CMake 配置中指定什么库?

我正在使用 Windows 10 和 CMake 3.14.1。

我正在尝试自己构建 OpenCV(版本 4.0.1),因为我需要 contrib 模块和 SFM 模块。我下载了 openBLAS 0.2.19 的预构建版本。它有 3 个目录:binincludelib。bin 目录包含 libopenblas.dll,include 具有标头,lib 中有 libopenblas.a 和 libopenblas.dll.a (以及 cmake 目录)。

当我使用 CMake 配置 openCV 时,我当然将 openBLAS_INCLUDE_DIR 设置为包含目录。但是我应该指定哪个文件来打开BLAS_LIB?libopenblas.dll、libopenblas.a 还是 libopenblas.dll.a?

稍后,当我构建 openCV(使用 Visual Studio 2017)时,我应该将 .dll 放在哪里,以便它对构建过程可见?

编辑:也许我应该补充一点,OpenBLAS 是用 minGW 编译的,这就是为什么有那些奇怪的 .a 和 .dll.a 文件而不是 .lib

opencv cmake openblas

5
推荐指数
1
解决办法
6299
查看次数

检查 scipy 和 numpy 中的 BLAS 和 LAPACK 库链接

我正在尝试将我的代码(尤其是 scipy.linalg.solve)链接到给定的库,例如 OpenBLAS。

我在虚拟环境中使用 python 3.7.7:

Python 3.7.7 (default, Mar 29 2020, 18:12:06) 
[Clang 11.0.3 (clang-1103.0.32.29)] on darwin
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是,我使用 pip 将 numpy 和 scipy 安装到我的虚拟环境中

pip install numpy
pip install scipy


>>> scipy.__version__
'1.4.1'

>>> numpy.__version__
'1.18.0'

>>> scipy.show_config()
lapack_mkl_info:
    NOT AVAILABLE
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
blas_mkl_info:
    NOT AVAILABLE
blis_info:
    NOT AVAILABLE
openblas_info:
    libraries …
Run Code Online (Sandbox Code Playgroud)

python macos numpy scipy openblas

5
推荐指数
0
解决办法
2976
查看次数

如何更好地控制 CPU 上每个 BLAS 内核调用所使用的线程数?

我正在编写一个 OpenMP 代码,在不同的线程中调用不同的 BLAS 内核,主要是具有不同大小的 DGEMM。为了最大限度地提高性能,我想控制我为每个 BLAS 调用的线程数。看起来这是一个非常明显的基本需求,尽管它很难做到。

OpenBLAS有一个功能openblas_set_num_threads(int n),在OpenBLAS代码的README文件中是这样描述的

这些仅在库初始化时使用一次,不可用于在单个 BLAS 调用中微调线程数。

所以我想我不能在 OpenBLAS 中使用这个功能。

MKL 有一个功能mkl_set_num_threads_local(int nt),当我使用 MKL 时,它似乎是我问题的答案。

有没有办法可以为每个 BLAS 调用调整线程数,而不管我使用的是什么库?(理想的选择)如果不是,是不是只有 MKL 才能让我调整线程数?

multithreading openmp intel-mkl openblas

5
推荐指数
0
解决办法
98
查看次数

使用 OpenBLAS 构建 R

我正在尝试构建 R-devel / R-patched。我读过一些链接,与执行此操作的步骤相关。

1) https://www.r-bloggers.com/2022/01/building-r-4-2-for-windows-with-openblas/
2) https://www.r-bloggers.com/2020/05/building-r-4-for-windows-with-openblas/
3) https://github.com/r-windows/r-base
Run Code Online (Sandbox Code Playgroud)

但不幸的是,没有任何成功。

在“1”中我没有“Makefile.win”,也没有带有“-lf77blas -latlas”的文件在“2”中手动创建的“full-build.sh”脚本不执行任何操作。在“3”中我有一个错误Use_ATLAS=YES

installing 'sysdata.rda'
make[3]: *** [../../../share/make/basepkg.mk:151: sysdata] Error 127
make[2]: *** [Makefile.win:22: all] Error 2
make[1]: *** [Makefile.win:32: R] Error 1
make: *** [Makefile:18: all] Error 2
Run Code Online (Sandbox Code Playgroud)

此错误与 basepkg.mk 中的这一行有关:

@$(ECHO) "tools:::sysdata2LazyLoadDB(\"$(srcdir)/R/sysdata.rda\",\"$(top_builddir)/library/$(pkg)/R\")" | \
  R_DEFAULT_PACKAGES=NULL LC_ALL=C $(R_EXE)
Run Code Online (Sandbox Code Playgroud)

那么,有人可以帮助我吗?这3种方式有什么问题吗?如何正确构建 R devel(如果可能的话使用安装文件)?也可以使用 AMD BLIS 库来编译它(我有 Ryzen 9 5950x)。

谢谢。

PS 我使用 Windows 11 和 winlibs PPS 中的 gcc-12.02 如果可能的话,请添加使用 AMD BLIS 构建 R 的方法...

r build openblas amd-processor r-devel

5
推荐指数
1
解决办法
1081
查看次数