概述#
软件组件#
ScaLAPACK 旨在提供效率和可移植性。此目标通过分离底层机器相关组件,同时保持与代码顺序版本相似的总体实现来实现。通常,BLAS 和 BLACS 被认为是需要针对不同计算平台优化的底层组件。
ScaLAPACK:并行线性代数运算。
PBLAS:BLAS 的并行版本。
BLACS:用于线性代数运算的 MPI 通信。
依赖项:MPI、BLAS 和 LAPACK。
NVPL ScaLAPACK 提供了两个主要动态库的几个变体
libnvpl_scalapack_<int_type>.so
包含 ScaLAPACK API、PBLAS 和重新分发工具;
libnvpl_blacs_<int_type>_<mpi_type>.so
接口,用于支持不同的 MPI 实现。
典型的安装目录结构如下所示(不包含 .so 版本符号链接)
$ tree
.
├── LICENSE
├── include
│ ├── nvpl_scalapack.h
│ ├── nvpl_scalapack_blacs.h
│ ├── nvpl_scalapack_cblacs.h
│ ├── nvpl_scalapack_pblas.h
│ ├── nvpl_scalapack_types.h
│ └── nvpl_scalapack_version.h
└── lib
├── cmake
│ └── nvpl_scalapack
│ ├── nvpl_scalapack-config-version.cmake
│ ├── nvpl_scalapack-config.cmake
│ ├── nvpl_scalapack-targets-release.cmake
│ └── nvpl_scalapack-targets.cmake
├── libnvpl_blacs_ilp64_mpich.so
├── libnvpl_blacs_ilp64_openmpi3.so
├── libnvpl_blacs_ilp64_openmpi4.so
├── libnvpl_blacs_ilp64_openmpi5.so
├── libnvpl_blacs_lp64_mpich.so
├── libnvpl_blacs_lp64_openmpi3.so
├── libnvpl_blacs_lp64_openmpi4.so
├── libnvpl_blacs_lp64_openmpi5.so
├── libnvpl_scalapack_ilp64.so
└── libnvpl_scalapack_lp64.so
构建和链接#
为了方便起见,我们假设 nvpl_ROOT
和 MPI_ROOT
的环境变量已设置为 NVPL 和 MPI 安装目录。以下示例说明了如何使用 lp64
整数类型和顺序 BLAS 及 LAPACK 接口构建应用程序。
### using MPI compiler wrapper
$ mpicxx -I${nvpl_ROOT}/include app.cpp -c -o app.cpp.o
$ mpicxx -o app app.cpp.o \
-L${nvpl_ROOT}/lib -lnvpl_scalapack_lp64 \
-lnvpl_blacs_lp64_openmpi4 \
-lnvpl_lapack_lp64_seq \
-lnvpl_blas_lp64_seq
### or, without MPI compiler wrapper
$ g++ -I${nvpl_ROOT}/include -DOMPI_SKIP_MPICXX app.cpp -c -o app.cpp.o
$ g++ -o app app.cpp.o \
-L${nvpl_ROOT}/lib -lnvpl_scalapack_lp64 \
-lnvpl_blacs_lp64_openmpi4 \
-lnvpl_lapack_lp64_seq \
-lnvpl_blas_lp64_seq \
-L${MPI_ROOT}/lib -lmpi
以下示例展示了如何使用 ilp64
整数类型并与并行版本的 BLAS 和 LAPACK 接口构建应用程序。
### using MPI compiler wrapper
$ mpicxx -DNVPL_ILP64 -I${nvpl_ROOT}/include app.cpp -c -o app.cpp.o
$ mpicxx -o app app.cpp.o \
-L${nvpl_ROOT}/lib -lnvpl_scalapack_ilp64 \
-lnvpl_blacs_ilp64_openmpi4 \
-lnvpl_lapack_ilp64_gomp \
-lnvpl_blas_ilp64_gomp
### or, without MPI compiler wrapper
$ g++ -DNVPL_ILP64 -I${nvpl_ROOT}/include -DOMPI_SKIP_MPICXX app.cpp -c -o app.cpp.o
$ g++ -o app app.cpp.o \
-L${nvpl_ROOT}/lib -lnvpl_scalapack_ilp64 \
-lnvpl_blacs_ilp64_openmpi4 \
-lnvpl_lapack_ilp64_gomp \
-lnvpl_blas_ilp64_gomp \
-L${MPI_ROOT}/lib -lmpi \
-lgomp
要运行代码,请确保 LD_LIBRARY_PATH
包含 ${nvpl_ROOT}/lib
和 ${MPI_ROOT}/lib
。
LP64 和 ILP64 接口#
NVPL ScaLAPACK 支持两种整数类型
32 位宽(又名 LP64 接口),以及
64 位宽(又名 ILP64 接口)。
默认情况下,编译假定为 LP64 整数。要链接到 ILP64 变体,另请设置下表中的编译器标志。
语言 |
ILP64 的编译器标志 |
描述 |
---|---|---|
C/C++ |
|
将 |
Fortran |
|
将默认整数/逻辑类型设置为 8 字节 |
启用 OpenMP#
NVPL ScaLAPACK 未实现新的多线程 API。OpenMP 支持通过链接到 BLAS 和 LAPACK 的 OpenMP 变体来启用:libnvpl_lapack_<int_type>_gomp.so
和 libnvpl_blas_<int_type>_gomp.so
库。
另请参阅