3

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

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

多谢!!!

4

1 回答 1

6

我假设我的 Debian 与您的 CentOS 足够接近,可以让这些技巧发挥作用......

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

  • 您可以搜索位置,例如/usr/include/usr/local/include文件lapacke.hlapacke_config.h、和。lapacke_mangling.hlapacke_mangling_with_flags.hlapacke_utils.h
  • 您可以搜索静态库/usr/lib或动态库或./usr/local/liblapacke.alapacke.solapacke.so.3

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

    make
    make lapackelib

包含文件将位于,lapack-3.6.1/LAPACKE/include库将位于lapack-3.6.1. gcc并且gfortran对于从头开始重新编译 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 时才需要它。

于 2016-12-05T22:02:44.073 回答