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