LINUX下使用C++编译、链接和运行LAPACK/LAPACKE?

7

简介: 我开发了一个使用LAPACK(LAPACKE)和MPI的C++应用程序,运行在Windows上表现良好(编译和链接通过Code::Blocks IDE处理),但执行速度太慢。因此,我想将代码迁移到我们的小型“超级计算机”上,该计算机运行在CentOS Linux下,我们已经安装了GNU C++、MPICH2和LAPACK。

问题: 如何在Linux/CentOS上编译/链接和运行调用LAPACKE的C++代码?我是否需要在CentOS机器上安装GNU Fortran才能编译/链接/运行带有LAPACK(LAPACKE)的C++代码?

非常感谢!!!

1个回答

9

我假设我的Debian与您的CentOS足够接近,这些技巧可以奏效...

1)检查您的计算机上是否安装了LAPACKE。

  • 您可以搜索像/usr/include/usr/local/include这样的位置,查找文件lapacke.hlapacke_config.hlapacke_mangling.hlapacke_mangling_with_flags.hlapacke_utils.h
  • 您可以搜索像/usr/lib/usr/local/lib这样的位置,查找静态库lapacke.a或动态库lapacke.solapacke.so.3

如果缺少这些文件,请考虑安装liblapackeliblapacke-dev软件包。或者,(特别是如果您没有root权限),您可以在http://www.netlib.org/lapack/#_lapack_version_3_6_1下载netlib的lapack和lapacke源代码。要编译LAPACKE,请将make.inc.example重命名为make.inc,然后键入:

    make
    make lapackelib

包含文件位于lapack-3.6.1/LAPACKE/include,库位于lapack-3.6.1。使用gccgfortran可以方便地从头重新编译lapack和lapacke。
2) 让我们编译一个基于这个例子的简单代码:
#include <iostream>
#include <string>
#include <fstream>

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <lapacke.h>
#include "mpi.h"

void print_matrix_rowmajor(const char* desc, lapack_int m, lapack_int n, double* a, lapack_int lda );

int main(int argc, char *argv[])
{
    MPI_Init(&argc,&argv);
    std::cout << "Start..." << std::endl;
    //std::string fn_VALS;

    /* Locals */
    double A[5][3] = {1,1,1,2,3,4,3,5,2,4,2,5,5,4,3};
    double b[5][2] = {-10,-3,12,14,14,12,16,16,18,16};
    lapack_int info,m,n,lda,ldb,nrhs;

    /* Initialization */
    m = 5;
    n = 3;
    nrhs = 2;
    lda = 3;
    ldb = 2;

    /* Print Entry Matrix */
    print_matrix_rowmajor( "Entry Matrix A", m, n, *A, lda );
    /* Print Right Rand Side */
    print_matrix_rowmajor( "Right Hand Side b", n, nrhs, *b, ldb );
    printf( "\n" );
    /* Executable statements */
    printf( "LAPACKE_dgels (row-major, high-level) Example Program Results\n" );
    /* Solve least squares problem*/
    info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*A,lda,*b,ldb);

    /* Print Solution */
    print_matrix_rowmajor( "Solution", n, nrhs, *b, ldb );
    printf( "\n" );


    std::cout << "info = " << info << std::endl;




    std::cout << "Done :-) !!!" <<std::endl;
    MPI_Finalize();
    return 0;
}


////////////////////////////////////////////////////////* Auxiliary routine: printing a matrix */
void print_matrix_rowmajor(const char* desc, lapack_int m, lapack_int n, double* a, lapack_int lda )
{
    lapack_int i, j;
    printf( "\n %s\n", desc );
    for( i = 0; i < m; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            printf( " %6.2f", a[i*lda+j]);
        }
        printf( "\n" );
    }
}
//=======================================

编译的命令为:

mpiCC main.cpp -o main -llapacke -llapack -lblas -lm -Wall

如果包含文件在特定文件夹中,请使用-I/usr/pathtolapackedoth。同样,如果库在特定文件夹中,请尝试-L/usr/lib/pathtoliblapackedota
根据MPICH2的安装方式,mpiCC很可能会包装g++。您可以输入mpiCC --version来了解更多信息。要使用2个进程运行它:
mpirun -np 2 main

最后,您不需要在CentOS机器上安装GNU Fortran才能使用LAPACK(LAPACKE)编译/链接/运行C ++。实际上,只有在您希望从头重新编译LAPACK时才需要它。


1
确实,LAPACK已经安装了,但是没有安装LAPACKE。LAPACK是线性代数库,而LAPACKE是一个小的包装器,可以轻松地从C/C++中调用LAPACK函数。这是两个不同的东西。您可以尝试使用“yum install lapack-devel”获取LAPACK的头文件。例如,请参见https://www.centos.org/forums/viewtopic.php?t=20984。我不知道开发人员包中是否包含LAPACKE:您可能需要从头开始重新编译LAPACKE... - francis
在文件夹 /usr 中没有任何包含单词 lapacke 的文件/文件夹。如果我编译您的测试程序,它会给我一堆错误,所有这些错误都指向某个未被识别的 LAPACKE_ 命令。因此,我将遵循您的建议并发布我的结果。 - Boki
1
不客气!您能否尝试将lapacke的头文件包含进来,就像C头文件一样,使用extern "C"{#include "lapacke.h"}?请参考https://dev59.com/M3A75IYBdhLWcg3wYH7I。 - francis
1
你读过这个提示吗?http://eigen.tuxfamily.org/bz/show_bug.cgi?id=452 如果你使用的是#include <complex.h>,你能否尝试改为#include <complex>(如果你使用这个)?另请参见https://dev59.com/An_aa4cB1Zd3GeqP1Eg9:它可能有助于理解问题。 - francis
1
嗨,我的gcc版本是4.9。根据https://dev59.com/An_aa4cB1Zd3GeqP1Eg9中的答案和评论,使用高于4.7的gcc版本可能会有所帮助。尝试在编译器行中添加“-std=c++11”。 - francis
显示剩余23条评论

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