NVBLAS公司

NVBLAS用户指南、嵌入式BLAS更换、多GPU加速

1介绍

NVBLAS库是一个GPU加速库,实现BLAS(基本线性代数子程序)。它可以通过将BLAS调用动态路由到系统中的一个或多个NVIDIA GPU来加速大多数BLAS Level-3例程,当调用的特性使其在GPU上加速时。

2NVBLAS概述

NVBLAS库仅使用CUBLASXT API构建在cuBLAS库的顶部(有关更多详细信息,请参阅cuBLAS文档的CUBLASX API部分)。NVBLAS还要求系统上存在CPU BLAS库。目前,NVBLAS仅拦截计算密集型BLAS 3级调用(见下表)。根据这些BLAS调用的特性,NVBLAS将把调用重定向到系统中的GPU或CPU。该决定基于一个简单的启发式算法,该算法估计BLAS调用的执行时间是否足以将输入和输出数据的PCI传输分摊到GPU。由于NVBLAS不支持所有标准BLAS例程,因此可能需要将其与现有的完整BLAS库关联。有关更多详细信息,请参阅使用部分。

三。GPU加速例程

NVBLAS只卸载计算密集型的BLAS3例程,这些例程在GPU上具有最佳的加速潜力。

下表显示了当前支持的例程:

例行程序

类型

操作

吉姆

S、 D、C、Z

2个矩阵的乘法

赛克

S、 D、C、Z

对称等级k更新

牧人

C、 Z

Hermitian等级-k更新

塞尔2k

S、 D、C、Z

对称等级-2k更新

her2k(赫克)

C、 Z轴

Hermitian等级-2k更新

trsm公司

S、 D、C、Z

具有多个右手边的三角解算

热带降水测量计划

S、 D、C、Z

三角矩阵-矩阵乘法

对称

S、 D、C、Z

对称矩阵-矩阵乘法

下摆

C、 Z轴

厄米矩阵-矩阵乘法

4BLAS符号拦截

标准BLAS库实现通常为同一例程公开多个符号。让我们说函数是BLAS例程名称,函数_或/和函数通常定义为外部符号。一些BLAS库还可能公开带有专有附加前缀的一些符号。NVBLAS仅截获符号函数_函数用户需要确保拟由NVBLAS进行GPU加速的应用程序实际调用那些定义的符号。任何其他符号都不会被截取,对于这些情况,将执行原始BLAS例程。

5设备内存支持

从8.0版开始,数据可以位于任何GPU设备上,甚至可以位于未配置为计算一部分的GPU设备上。当任何数据位于GPU上时,无论问题大小,计算都将在GPU上进行。此外,必须谨慎使用此功能:用户必须确保BLAS调用确实会被NVBLAS拦截,否则当CPU BLAS尝试执行时,它将导致崩溃。

6安全防范措施

由于NVBLAS库依赖于符号拦截机制,因此必须确保其未被破坏。在这方面,不应从以提升权限运行的进程(例如Windows上的Administrator或Linux上的root)中使用NVBLAS。

7配置

由于NVBLAS是BLAS的一种插入式替换,因此必须通过ASCII文本文件进行配置,该文件描述了可以参与拦截的BLAS调用的GPU数量和数量。配置文件在加载库时进行解析。配置文件的格式基于关键字,可以选择后跟一个或多个用户定义参数。每行最多允许一个关键字。空行或以字符开头的行#被忽略。

7.1.NVBLAS_CONFIG_FILE环境变量

配置文件的位置和名称必须由环境变量定义NVBLAS_CONFIG_文件。默认情况下,如果NVBLAS_CONFIG_文件未定义,NVBLAS将尝试打开该文件nvblas.conf公司在当前目录中。为了安全使用NVBLAS,配置文件应该具有受限的写入权限。

7.2.配置关键字

配置关键字语法在以下小节中进行了描述。

7.2.1.NVBLAS_日志文件

此关键字定义NVBLAS应在其中打印状态和错误消息的文件。默认情况下,如果未定义,将使用标准错误输出文件(例如stderr)。建议在配置的早期定义此关键字,以捕获解析该文件本身时的错误。

7.2.2.NVBLAS_TRACE_LOG_禁用

定义此关键字后,每个截获的BLAS调用都将记录到NVBLAS_LOGFILE中。此功能虽然具有侵入性,但对于调试目的来说可能很有用。

7.2.3.NVBLAS_CPU_BLAS_LIB

该关键字定义了CPU BLAS动态库文件(例如,.所以Linux上的文件或.dll文件在Windows上),NVBLAS应打开以查找CPU BLAS符号定义。必须定义此关键字,NVBLAS才能工作。因为CPU Blas库通常由多个文件组成,即使此关键字设置为CPU库主文件的完整路径,可能仍需要定义正确的路径,才能在系统环境中找到其余的库文件。在Linux上,这可以通过设置环境变量来实现LD_LIBRARY_PATH(本地_远程_路径)而在Windows上,这可以通过设置环境变量来实现路径.

为了安全使用NVBLAS,强烈建议采取以下预防措施:

  • CPU BLAS库应该位于普通用户没有写入权限的位置。

  • 指定的路径应该是绝对路径,而不是相对路径。

7.2.4.NVBLAS_GPU列表

这个关键字定义了应该参与拦截的BLAS调用的计算的GPU列表。如果未定义,则只使用GPU设备0,因为这通常是系统中安装的最具计算能力的GPU。可以将此关键字设置为由空白字符分隔的设备编号列表。为了简单起见,还接受以下通配符关键字:

关键字

含义

所有

NVBLAS将使用系统上检测到的所有可计算GPU

全部0

GPU设备0以及检测到的与设备0具有相同计算能力的所有其他GPU将由NVBLAS使用

注意

在CUBLAS的当前版本中,CUBLASXT API支持两个GPU,前提是它们位于同一块板上,如特斯拉K10或GeForce GTX690,否则支持一个GPU。由于NVBLAS构建在CUBLASXT API之上,因此NVBLAS具有相同的限制。如果需要访问更多GPU设备,请参阅立方Xt.

7.2.5.NVBLAS_TILE_DIM

此关键字定义应用于划分计算中涉及的矩阵的分片维度。此定义直接映射到cublasXt API例程的调用cublasXt设置块尺寸。请参阅cuBLAS文档了解与将其设置为较大或较小值相关的权衡。

7.2.6.NVBLAS_GPU_DISABLED_<BLAS_FUNC_NAME>

此关键字附加了BLAS例程的名称,可禁用NVBLAS在GPU上运行指定的例程。此功能主要用于调试目的。默认情况下,会启用所有支持的BLAS例程。

7.2.7.NVBLAS_CPU_RATIO_<BLAS_FUNC_NAME>

这个关键字,加上ta BLAS例程的名称,定义了在NVBLAS决定在GPU上卸载该例程的工作时,应保留在CPU上的工作负载的比率。此功能直接映射到cublasXt API例程立方X设置压缩比。默认情况下,所有例程的比率都定义为零。请参阅cuBLAS文档详细信息和支持此功能的例程列表。

7.2.8.NVBLAS_AUTOPIN_MEM启用

此关键字启用固定内存模式。此功能直接映射到cublasXt API例程cublasXt设置固定内存模式。如果配置文件中不存在此键,则固定内存模式将设置为立方体xt_pining_DISABLED.

注意

根据基本例程的cuBLAS文档中的规定,使用此功能有一些限制cublasXt设置固定内存模式。特别是当NVBLAS用于多线程应用程序时,如果调用NVBLA时不同线程使用的矩阵可能重叠,则不应使用此选项。请参阅例行程序的cuBLAS文档`cublasXt设置固定内存模式<https://docs.nvidia.com/cuda/cublas/index.html#cublasxt_setPinningMemMode>`__了解详细信息。

7.2.9.配置文件示例

以下示例显示了典型的NVBLAS配置文件:

#这是使用NVBLAS库的配置文件#设置环境变量NVBLAS_CONFIG_FILE以指定您自己的配置文件。#默认情况下,如果未定义NVBLAS_CONFIG_FILE,#NVBLAS Library将尝试打开其当前目录中的文件“NVBLAS.conf”#示例:NVBLAS_CONFIG_FILE/home/cuda_user/my_NVBLAS.conf#配置文件应该具有受限的写入权限访问#指定哪个输出日志文件(默认为stderr)NVBLAS_LOGFILE NVBLAS.log#启用每个拦截的BLAS调用的跟踪日志NVBLAS_TRACE_LOG_禁用#将您选择的CPU BLAS后备库放在这里#强烈建议使用完整路径来描述CPU库的位置NVBLAS_CPU_BLAS_LIB/usr/LIB/libopenblas.so#NVBLAS_CPU_BLAS_LIB<mkl_path_installation>/libmkl_rt.so#要参与计算的GPU设备Id列表#如果您希望所有的GPU都做出贡献,请使用ALL#如果希望所有与设备0类型相同的GPU都参与,请使用ALL0#然而,NVBLAS认为所有GPU都具有相同的性能和PCI带宽#默认情况下,如果未列出GPU,则仅使用设备0#NVBLAS_GPU_LIST 0 2 4#NVBLAS_GPU_LIST全部NVBLAS_GPU_LIST所有0#平铺尺寸NVBLAS_TILE_DIM 2048#自动锁定存储器NVBLAS_AUTOPIN_MEM启用#阻止在GPU上运行的BLAS例程列表(用于调试目的#NVBLAS支持的BLAS例程的当前列表为#GEMM、SYRK、HERK、TRSM、TRMM、SYMM、HEMM、SYR2 K、HER2 K#NVBLAS_GPU_DISABLED_SGEMM公司#NVBLAS_GPU_DISABLED_DGEMM公司#NVBLAS_GPU_DISABLED_CGEMM公司#NVBLAS_GPU_DISABLED_ZGEMM公司#可以选择在CPU和GPU之间混合计算#默认情况下,GPU支持的BLAS例程完全在GPU上运行#选项NVBLAS_CPU_RATIO_<BLAS_ROUTINE>给出比率[0,1]#应该在CPU上完成的计算量#注意:应该明智地使用此选项,因为它实际上可以#如果给CPU太多工作,则会显著降低总体性能#NVBLAS_CPU_RATIO_CGEMM 0.07

8NVBLAS安装

NVBLAS库是CUDA工具包的一部分,将与所有其他CUDA库一起安装。它可用于64位操作系统。NVBLAS库构建在cuBLAS之上,因此cuBLAS库需要能够被NVBLA访问。

9用法

要使用NVBLAS库,除了原始的CPU Blas外,用户应用程序还必须与NVBLAS重新链接(技术上只需要NVBLA,除非应用程序使用了一些NVBLA不支持的Blas例程)。为了确保链接器链接到NVBLAS的公开符号,而不是CPU BLAS的符号,需要在链接命令行中将NVBLAS-Library放在CPU BLAS之前。

在Linux上,使用NVBLAS库的另一种方法是使用LD_重新加载环境变量;这种技术的优点是避免了重新链接步骤。但是,用户应避免全局定义该环境变量,因为它会导致系统上执行的每个shell命令都加载NVBLAS库,从而导致系统缺乏响应性。

最后,数学工具和库通常提供了通过环境变量或配置文件指定要使用的BLAS库的机会。由于NVBLAS不支持所有的标准BLAS例程,因此可能需要将NVBLA与完整的BLAS库配对,即使您的应用程序只调用支持的NVBLAS例程。幸运的是,这些工具和库通常提供了一种指定多个BLAS库的方法。有关详细信息,请参阅相应工具和库的文档。

10通知

10.1.通知

本文件仅供参考,不应视为对产品的某些功能、条件或质量的保证。英伟达公司(“NVIDIA”)对本文件中所含信息的准确性或完整性不作任何明示或暗示的陈述或保证,也不对本文件中的任何错误承担任何责任。NVIDIA不对此类信息的使用或后果承担任何责任,也不对因使用此类信息而可能侵犯第三方的专利或其他权利承担任何责任。本文档不承诺开发、发布或交付任何材料(定义如下)、代码或功能。

NVIDIA保留随时对本文件进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。

客户应在下单前获得最新的相关信息,并应验证这些信息是最新的和完整的。

除非NVIDIA授权代表与客户签署的单独销售协议(“销售条款”)中另有约定,否则NVIDIA产品的销售应遵守订单确认时提供的NVIDIB标准销售条款和条件。NVIDIA特此明确反对在购买本文件中提及的NVIDIA产品时适用任何客户通用条款和条件。本文件不直接或间接构成任何合同义务。

NVIDIA产品的设计、授权或保证不适用于医疗、军事、飞机、太空或生命支持设备,也不适用于NVIDIA产品的故障或故障可能导致人身伤害、死亡、财产或环境损害的应用。NVIDIA对在此类设备或应用中包含和/或使用NVIDIA产品不承担任何责任,因此,客户自行承担此类包含和/或者使用的风险。

NVIDIA不对基于本文档的产品适用于任何指定用途做出任何声明或保证。NVIDIA不一定要对每个产品的所有参数进行测试。客户全权负责评估和确定本文件中包含的任何信息的适用性,确保产品适合客户计划的应用,并对应用程序进行必要的测试,以避免应用程序或产品出现故障。客户产品设计中的不足可能会影响NVIDIA产品的质量和可靠性,并可能导致本文件中所包含的条件和/或要求之外的其他或不同的条件和要求。NVIDIA不承担与任何违约、损坏、成本或问题相关的责任,这些违约、损坏或问题可能基于或归因于:(i)以任何违反本文件的方式使用NVIDIA产品,或(ii)客户产品设计。

本文件项下的任何NVIDIA专利权、版权或其他NVIDIA知识产权均未授予任何明示或暗示的许可。NVIDIA发布的有关第三方产品或服务的信息并不构成NVIDIA使用此类产品或服务或其担保或背书的许可。使用此类信息可能需要第三方根据第三方的专利或其他知识产权授予许可,或NVIDIA根据NVIDIA的专利或其它知识产权授予的许可。

只有在事先获得NVIDIA书面批准、无需更改且完全符合所有适用出口法律法规并附有所有相关条件、限制和通知的情况下,才允许复制本文件中的信息。

本文件和所有NVIDIA设计规范、参考板、文件、图纸、诊断、列表和其他文件(统称为“材料”)均按“原样”提供。NVIDIA不对材料做出任何明示、暗示、法定或其他担保,并明确否认对非侵权性、适销性和特定用途适用性的所有默示保证。在法律未禁止的范围内,在任何情况下,NVIDIA都不对因使用本文件而产生的任何损害承担责任,包括但不限于任何直接、间接、特殊、偶然、惩罚性或后果性损害,无论是何种原因造成的,无论责任理论如何,即使NVIDIA已被告知此类损害的可能性。尽管客户可能因任何原因遭受任何损害,但NVIDIA对本协议所述产品的累计责任应根据产品销售条款进行限制。

10.2.开放式CL

OpenCL是Apple Inc.的商标,根据Khronos Group Inc.的许可使用。

10.3.商标

NVIDIA和NVIDIAlogo是NVIDIA Corporation在美国和其他国家的商标或注册商标。其他公司和产品名称可能是与其关联的各个公司的商标。