2016-12-05 6 views
1

소개 : 저는 Windows에서 LAPACK (LAPACKE)과 MPI를 사용하는 C++ 응용 프로그램을 개발했습니다. Windows에서 제대로 작동합니다 (컴파일 및 링크는 Code :: Blocks IDE를 통해 처리됩니다). 그러나 실행 속도가 너무 느립니다. 따라서 코드를 CentOS Linux에서 실행되는 작은 "수퍼 컴퓨터"로 마이그레이션하고 싶습니다. 여기서 우리는 이미 GNU C++, MPICH2 및 LAPACK을 설치했습니다.LAPACK/LAPACKE (리눅스에서 C++ 사용) - 컴파일, 링크 및 실행 중입니까?

질문 : Linux/CentOS에서 LAPACKE을 (를) 호출하는 C++ 코드를 컴파일/링크 및 실행하는 방법은 무엇입니까? LAPACK (LAPACKE)으로 C++를 컴파일/링크/실행하려면 CentOS 컴퓨터에 GNU Fortran을 설치해야합니까?

고맙습니다 !!!

답변

3

나는

1) 그 LAPACKE이 계산에 설치되어 확인 ... 내 데비안이 트릭이 작동하기 위해 CentOS는 충분히 가까운 것으로 가정합니다.

  • 당신은 파일 lapacke.h, lapacke_config.h, lapacke_mangling.h, lapacke_mangling_with_flags.hlapacke_utils.h에 대한 /usr/include, /usr/local/include 같은 위치를 검색 할 수 있습니다.
  • 정적 라이브러리 lapacke.a 또는 동적 라이브러리 lapacke.so 또는 lapacke.so.3에 대해 /usr/lib 또는 /usr/local/lib과 같은 위치를 검색 할 수 있습니다.

이러한 파일이 누락 된 경우 liblapackeliblapacke-dev 패키지를 설치하는 것이 좋습니다. (루트 권한이없는 경우 특히) 또는, 당신은 make.inc-make.inc.example의 이름을 변경, LAPACKE을 컴파일하려면 http://www.netlib.org/lapack/#_lapack_version_3_6_1에서 NETLIB의 LAPACK 및 lapacke의 소스를 다운로드 할 수 있습니다, 다음 입력 :

make 
    make lapackelib 

(가) 파일이있을 것입니다 포함 lapack-3.6.1/LAPACKE/include에 있으며 도서관은 lapack-3.6.1입니다. gccgfortran은 lapack과 lapacke를 처음부터 다시 컴파일하는 데 유용합니다.

2)의이 this example에 따라 간단한 코드를 컴파일하자 컴파일

#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을 입력하십시오. 이 개 프로세스를 사용하여 실행하려면 :

mpirun -np 2 main 

을 마지막으로, LAPACK (LAPACKE)와 ++/링크/실행 C를 컴파일하기 위해 GNU 포트란은 CentOS는 시스템에 설치 설치할 필요가 없습니다. 실제로 처음부터 LAPACK을 다시 컴파일하려는 경우에만 필요합니다.

+0

고마워요. 내가 그것에 종사하자, 내가 한 일을 게시 할 것이다. – Boki

+0

먼저 LAPACK (E)의 설치를 검색했습니다 : – Boki

+0

타이핑 ** lapack 찾기 ** – Boki