如何在Linux集群中构建BLAS和LAPACK以供C++使用?

5

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

sudo apt-get install libblas-dev liblapack-dev

接着,我通过输入以下代码在编译时进行了链接

g++ main.cpp -llapack -lblas
然而,我正在使用的集群似乎没有这两个库安装。它在集群上运行得很慢,但是芯片更好。我认为它已经安装了lapack库,但没有blas库。我想安装两者。

如果既不能访问root也不能使用apt-get,我该如何构建和编译lapackblas库呢?

以下是一个简短的测试脚本。

#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"函数以减少杂乱)。

谢谢您的时间。

2个回答

9

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

LAPACK

  • 下载LAPACK的最新版本。
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

1
注意:使用OpenBLAS而不是Netlib的BLAS将显着提高性能。 - GeneralCode
如果你的最终目标是一个共享库,确保在make.inc的FFLAGS和FFLAGS_NOOPT中包含-fPIC标志。Lapack的制作过程可能需要一段时间。 - John Jiang

2
你可以通过git将官方仓库克隆到你的集群中:
git clone https://github.com/xianyi/OpenBLAS.git

现在切换到克隆的仓库,编译并安装:

cd OpenBLAS
make 
make install PREFIX=~/blas

现在您可以这样链接BLAS:

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

有关编译BLAS的更多信息可以在官方存储库中找到。
同样适用于LAPACK

根据存储库中的README.md,LAPACK可以使用CMAKE进行编译:

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

这里的 ~ 东西有什么作用? - GeneralCode
~ 是您当前用户的主目录。您可以指定完整路径,例如 /home/user/blas/ - Aleksey
谢谢。@Aleksey,你给出的指令只适用于blas而不是lapack。当我在lapack文件夹中运行make时,它会显示错误信息。有什么想法吗? - GeneralCode
1
更新答案,附带LAPACK编译示例。 - Aleksey
现在我在包含lapack库时遇到了各种未定义的引用错误。 - GeneralCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接