LAPACK/LAPACKE 在 LINUX 上使用 C++ --- 编译、链接和 运行?
LAPACK/LAPACKE with C++ on LINUX --- Compiling, Linking and Running?
简介:
我用 C++ 开发了一个应用程序,它利用了 LAPACK(LAPACKE) 和 MPI,所有这些都在 Windows 上。在 Windows 中工作正常(编译和链接通过 Code::Blocks IDE 处理),但执行速度太慢。因此,我想将代码迁移到我们已经安装了 GNU C++、MPICH2 和 LAPACK 的 CentOS Linux 下的小型 "supercomputer" 运行。
问题:
如何 COMPILE/LINK 和 运行 一个在 Linux/CentOS 上调用 LAPACKE 的 C++ 代码?我是否必须在 CentOS 机器上安装 GNU Fortran 才能 compile/link/run C++ with LAPACK(LAPACKE)?
非常感谢!!!
我假设我的 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
。或者,(特别是如果您没有 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
。 gcc
和 gfortran
对于从头开始重新编译 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
以了解更多信息。 运行 它使用 2 个进程:
mpirun -np 2 main
最后,您不必在 CentOS 机器上安装 GNU Fortran 即可 compile/link/run C++ with LAPACK(LAPACKE)。事实上,只有当您希望从头开始重新编译 LAPACK 时才需要它。
简介: 我用 C++ 开发了一个应用程序,它利用了 LAPACK(LAPACKE) 和 MPI,所有这些都在 Windows 上。在 Windows 中工作正常(编译和链接通过 Code::Blocks IDE 处理),但执行速度太慢。因此,我想将代码迁移到我们已经安装了 GNU C++、MPICH2 和 LAPACK 的 CentOS Linux 下的小型 "supercomputer" 运行。
问题: 如何 COMPILE/LINK 和 运行 一个在 Linux/CentOS 上调用 LAPACKE 的 C++ 代码?我是否必须在 CentOS 机器上安装 GNU Fortran 才能 compile/link/run C++ with LAPACK(LAPACKE)?
非常感谢!!!
我假设我的 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
。或者,(特别是如果您没有 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
。 gcc
和 gfortran
对于从头开始重新编译 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
以了解更多信息。 运行 它使用 2 个进程:
mpirun -np 2 main
最后,您不必在 CentOS 机器上安装 GNU Fortran 即可 compile/link/run C++ with LAPACK(LAPACKE)。事实上,只有当您希望从头开始重新编译 LAPACK 时才需要它。