3

はじめに: LAPACK(LAPACKE) と MPI をすべて Windows で利用する C++ でアプリケーションを開発しました。Windows では問題なく動作します (コンパイルとリンクは Code::Blocks IDE で処理されます) が、実行速度が遅すぎます。したがって、GNU C++、MPICH2、LAPACK が既にインストールされている CentOS Linux で実行されている小さな「スーパーコンピューター」にコードを移行したいと考えています。

質問: Linux/CentOS で LAPACKE を呼び出す C++ コードをコンパイル/リンクして実行する方法は? LAPACK(LAPACKE) で C++ をコンパイル/リンク/実行するには、CentOS マシンに GNU Fortran をインストールする必要がありますか?

どうもありがとう!!!

4

1 に答える 1

6

これらのトリックが機能するには、私の Debian があなたの CentOS に十分近いと思います...

1) LAPACKE がコンピュータにインストールされていることを確認します。

  • /usr/include/usr/local/includeファイル、、、lapacke.hなどlapacke_config.hlapacke_mangling.h場所lapacke_mangling_with_flags.hを検索できますlapacke_utils.h
  • /usr/libまたはのような場所/usr/local/libを静的ライブラリlapacke.aまたは動的ライブラリlapacke.soまたはで検索できますlapacke.so.3

これらのファイルが見つからない場合は、パッケージliblapackeliblapacke-dev. 別の方法として (特に root 権限を持っていない場合)、http://www.netlib.org/lapack/#_lapack_version_3_6_1 で netlib の lapack と lapacke のソースをダウンロードできmake.inc.exampleますmake.inc

    make
    make lapackelib

インクルード ファイルは にlapack-3.6.1/LAPACKE/includeあり、ライブラリは にありますlapack-3.6.1gcclapackとgfortranlapacke を最初から再コンパイルするのに便利です。

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 のインストール方法によっては、mpiCCg++ をラップする可能性があります。入力mpiCC --versionして詳細を確認できます。2 つのプロセスを使用して実行するには:

mpirun -np 2 main

最後に、LAPACK(LAPACKE) で C++ をコンパイル/リンク/実行するために、CentOS マシンにインストールされている GNU Fortran をインストールする必要はありません。実際、LAPACK をゼロから再コンパイルする場合にのみ必要です。

于 2016-12-05T22:02:44.073 に答える