构建和链接#
概述#
NVPL LAPACK 库由两层组成
接口层:此层为用户提供不同的功能,例如不同的整数宽度以及对不同线程运行时的支持。有多个接口库,每个库代表一个特定的配置。一个应用程序不得链接多个接口库。
核心层:一个包含功能优化实现的单一库。
所有接口库都依赖于核心库。当使用动态库时,仅链接接口库就足够了,因为它显式地依赖于核心库。
当链接使用 NVPL LAPACK 的应用程序时,请注意 NVPL LAPACK 依赖于 NVPL BLAS,并且这两个库都具有 LP64/ILP64 接口层,可以是顺序的或并行的。
在下文中,我们将给出示例和说明,介绍如何使用 NVPL LAPACK 和 BLAS 及其相应的 LP64/ILP64 接口以及不同的线程类型来构建和链接您的应用程序。
快速示例#
要构建使用 LP64 顺序 NVPL LAPACK 和顺序 NVPL BLAS 的应用程序
gcc app.c -c -o app.o
gcc app.o -lnvpl_lapack_lp64_seq -lnvpl_blas_lp64_seq
要构建使用 ILP64 线程 NVPL LAPACK 和线程 NVPL BLAS 的应用程序
gcc app.c -c -o app.o -DNVPL_ILP64
gcc app.o -lnvpl_lapack_ilp64_gomp -lnvpl_blas_ilp64_gomp -lgomp
LP64 和 ILP64 接口#
NVPL LAPACK 在 F90 LAPACK 和 LAPACKE API 中支持两种整数类型
32 位宽(又名 LP64 接口),以及
64 位宽(又名 ILP64 接口)。
在接口之间切换需要使用正确的编译器标志并链接到正确的 NVPL LAPACK 接口库。
编译:C / C++#
C API 使用 nvpl_int_t
类型作为整数参数,该类型扩展为 int32_t
或 int64_t
(或等效类型),具体取决于是否定义了 NVPL_ILP64
宏。
链接#
由于 LP64 和 ILP64 接口具有相同的函数名称,因此 NVPL LAPACK 为这些情况提供了不同的库。请确保您链接到正确的库,否则在运行时您可能会得到不正确的结果或应用程序崩溃。
要使用 LP64 接口,请链接
libnvpl_lapack_lp64_*
接口库。要使用 ILP64 接口,请链接
libnvpl_lapack_ilp64_*
接口库。
线程接口#
NVPL LAPACK 具有库的顺序和线程(使用 OpenMP)接口。用户应将其应用程序或库链接到首选选项。
顺序#
顺序接口不依赖于任何线程运行时,并且所有函数仅使用调用线程来执行计算。要使用它,请链接 libnvpl_lapack_*_seq
接口库。
基于 OpenMP 的线程#
基于 OpenMP 的线程接口基于 GNU OpenMP 运行时。要使用它,请链接 libnvpl_lapack_*_gomp
接口库。
以下运行时与 GNU OpenMP 运行时 ABI 兼容
GNU OpenMP 运行时:
libgomp.so.1
。LLVM OpenMP 运行时:
libomp.so
,libomp.so.5
等。NVIDIA 的 OpenMP 运行时:
libnvomp.so
。
此处的 ABI 兼容性意味着使用 GNU OpenMP 构建的应用程序或库(包括 NVPL LAPACK 基于 OpenMP 的线程接口)可以与其他这些运行时透明地工作。
由于不同的 OpenMP 运行时使用不同的库名称,因此 NVPL LAPACK 基于 OpenMP 的线程接口不显式依赖于任何运行时。相反,该库实现了惰性 动态符号解析。
惰性意味着符号解析在运行时首次使用时发生。
动态意味着符号使用
dlopen()
和dlsym()
API(或类似物)解析。NVPL LAPACK 首先尝试在当前进程的地址空间中查找 OpenMP 符号,如果失败,则加载 (
dlopen()
) 默认运行时,即 GNU OpenMP。
警告
由于 NVPL LAPACK 基于 OpenMP 的线程接口不显式依赖于任何特定的 OpenMP 运行时(默认运行时为 GNU OpenMP 运行时),因此强烈建议始终将适当的 OpenMP 运行时链接到最终应用程序或使用 NVPL LAPACK 的库。这将确保在执行期间加载适当的 OpenMP 运行时。
另请参阅