如何在 Linux 集群上构建用于 C++ 的 BLAS 和 LAPACK?

How to build BLAS and LAPACK for use in C++ on Linux cluster?

我正在处理一个很大的计算问题。为了降低方阵中一组线性方程的计算速度,我使用了 lapackblas。要在我的笔记本电脑上获取库 (Ubuntu 2020),我 运行 以下命令

sudo apt-get install libblas-dev liblapack-dev

然后我通过输入以下内容在编译时链接代码

g++ main.cpp -llapack -lblas

但是,我正在处理的集群似乎没有安装这两个库。它在集群上要慢得多,但芯片更好。它运行,所以我认为它安装了 lapack 库,但没有 blas。我想安装两者。

我如何构建和编译 lapackblas 访问 root 或 apt-get

这是一个简短的测试脚本。

#include <iostream>
#include <vector>

extern "C" void dgesv_( int *n, int *nrhs, double  *a, int *lda, int *ipiv, double *b, int *lbd, int *info  );

int main() {
    int SIZE = 3;
    int nrhs = 1; // one column in b
    int lda = SIZE;
    int ldb = SIZE;
    std::vector<int> i_piv(SIZE, 0);  // pivot column vector
    int info;
    std::vector<double> A(SIZE*SIZE, 0); // sq mat with 0's
    A = {5, 2, 8, 9, 7, 2, 10, 3, 4};
    std::vector<double> b(SIZE);
    b = {22, 13, 17};

    dgesv_( &SIZE, &nrhs, &*A.begin(), &lda, &*i_piv.begin(), &*b.begin(), &ldb, &info );
    return 0;
}

我想用

构建它
g++ main.cpp -L/path/to/lapack -L/path/to/blas -llapack -lblas

其中 b 矩阵被替换为解决方案,解决方案是 1.71, 1.29, 0.18(这是任意的,所以我没有在代码中提供“print_matrix”函数来减少混乱)。

感谢您的宝贵时间。

您可以通过 git:

将官方仓库克隆到您的集群
git clone https://github.com/xianyi/OpenBLAS.git

现在 cd 到克隆的 repo,编译并安装它:

cd OpenBLAS
make 
make install PREFIX=~/blas

现在您可以 link BLAS 这样:

g++ main.cpp -L~/blas/lib -lblas

有关编译 BLAS 的更多信息,请参阅 official repo
LAPACK.

相同

根据 repo README.md,LAPACK 可以用 CMAKE 编译:

cd lapack
mkdir build
cd build
cmake -DCMAKE_INSTALL_LIBDIR=/home/user/lapack ..
cmake --build . -j --target install

BLAS

  • 下载最新版本BLAS

  • 打开终端并转到保存它的目录

tar -xvf blas-3.8.0.tgz  # unzip the blas source files
cd BLAS-3.8.0/ 
make
mv blas_LINUX.a libblas.a
mv *.a path/to/lib  # move the blas lib to the library you will be including at compile

拉帕克

tar -xvf lapack-3.9.0.tar.gz
cd lapack-3.9.0/
cp make.inc.example make.inc  # use example make as make
make
cp *.a path/to/lib

现在库已经构建,并存储在path/to/lib中,可以编译问题中的简短示例代码。

g++ main.cpp -L/path/to/lib -llapack -lblas -lgfortran  # compiles the code
./a.out  # runs the code