我用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?
当我编译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)
有解决方案吗?
两天来,我一直在尝试使用 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) 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?
谢谢,如果有人可以解释一下。
在一个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 文件blas并lapack通过 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不会破坏它?我无法删除blas和lapack软件包,因为主机的其他客户端可能依赖它。blas相反,我会以某种方式让操作系统了解 OpenBLAS 是和的直接替代品lapack。
我正在对两个矩阵进行 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) 我正在使用 Windows 10 和 CMake 3.14.1。
我正在尝试自己构建 OpenCV(版本 4.0.1),因为我需要 contrib 模块和 SFM 模块。我下载了 openBLAS 0.2.19 的预构建版本。它有 3 个目录:bin、include和lib。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
我正在尝试将我的代码(尤其是 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) 我正在编写一个 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 才能让我调整线程数?
我正在尝试构建 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 的方法...