概述#

软件组件#

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_ROOTMPI_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++

-DNVPL_ILP64

nvpl_int_t 扩展为 int64_t

Fortran

-fdefault-integer-8 (用于 GNU)

将默认整数/逻辑类型设置为 8 字节

启用 OpenMP#

NVPL ScaLAPACK 未实现新的多线程 API。OpenMP 支持通过链接到 BLAS 和 LAPACK 的 OpenMP 变体来启用:libnvpl_lapack_<int_type>_gomp.solibnvpl_blas_<int_type>_gomp.so 库。

另请参阅