2016-12-05 10 views
1

Intro: Я разработал приложение на C++, которое использует LAPACK (LAPACKE) и MPI, все в Windows. Работает нормально в Windows (компиляция и привязка выполняются с помощью Code :: Blocks IDE), но выполнение слишком медленное. Следовательно, я хочу перенести код на наш небольшой суперкомпьютер, работающий под CentOS Linux, где мы уже установили GNU C++, MPICH2 и LAPACK.LAPACK/LAPACKE с C++ на LINUX --- Компиляция, связывание и запуск?

Вопросы: Как компилировать/LINK и запустить код C++, который вызывает LAPACKE на Linux/CentOS? Должен ли я иметь GNU Fortran, установленный на машине CentOS, чтобы скомпилировать/связать/запустить C++ с LAPACK (LAPACKE)?

СПАСИБО МНОГО!

ответ

3

Я предполагаю, что мой Debian достаточно близко к вашему CentOS, чтобы эти приемы, чтобы работать ...

1) Проверьте, установлена ​​ли LAPACKE на вашем вычислене.

  • Вы можете искать места, как /usr/include, /usr/local/include для файлов lapacke.h, lapacke_config.h, lapacke_mangling.h, lapacke_mangling_with_flags.h и lapacke_utils.h.
  • Вы можете найти такие места, как /usr/lib или /usr/local/lib для статической библиотеки lapacke.a или динамической библиотеки lapacke.so или lapacke.so.3.

Если эти файлы отсутствуют, рассмотрите возможность установки пакетов liblapacke и liblapacke-dev. С другой стороны, (в частности, если вы не имеете прав администратора), вы можете скачать источник LAPACK Netlib и lapacke в http://www.netlib.org/lapack/#_lapack_version_3_6_1 Для компиляции LAPACKE, переименовывать make.inc.example в make.inc, затем введите:

make 
    make lapackelib 

включаемые файлы будут расположенный в lapack-3.6.1/LAPACKE/include, и библиотека будет в lapack-3.6.1. gcc и gfortran полезны для перекомпиляции лапаков и лапаков с нуля.

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, чтобы узнать больше. Для того, чтобы запустить его с помощью 2 процесса:

mpirun -np 2 main 

Наконец, вы не должны установить GNU Fortran, установленные на машине CentOS для компиляции/ссылки/запуска C++ с LAPACK (LAPACKE). В самом деле, это требуется только в том случае, если вы хотите перекомпилировать LAPACK с нуля.

+0

Большое спасибо. Позвольте мне поработать над этим, и я опубликую то, что я сделал. – Boki

+0

Во-первых, я искал установку LAPACK (E): – Boki

+0

Typing ** locate lapack ** дал мне следующий (только часть списка) – Boki