用户指南#

术语表#

术语“张量”指的是n 阶(又名 n 维)数组。可以将张量视为矩阵到更高的推广。例如,标量、向量和矩阵分别是 0 阶、1 阶和 2 阶张量。

n 阶张量有 \(n\)。每个模都有一个范围(又名大小)。对于每个模,您可以指定一个步幅 \(s > 0\)。此步幅描述了沿该模的两个逻辑上连续的元素在物理内存中相隔多远。它们的功能类似于 BLAS 中的前导维度,例如,允许对子张量进行操作。

默认情况下,nvplTENSOR 遵循广义的列优先数据布局。例如:\(A_{a,b,c} \in {R}^{4\times 8 \times 12}\) 是一个 3 阶张量,其 a 模、b 模和 c 模的范围分别为 4、8 和 12。如果未明确指定,则步幅假定为

  • \(stride(a) = 1\)

  • \(stride(b) = extent(a)\)

  • \(stride(c) = extent(a) * extent(b)\).

如果张量沿所有模连续存储在内存中,则认为它是packed。也就是说,\(stride(i_1) = 1\)\(stride(i_l) = stride(i_{l-1}) * extent(i_{l-1})\)

爱因斯坦求和约定#

nvplTENSOR 遵循“爱因斯坦求和约定”:出现在输入张量中但未出现在输出张量中的模会被隐式收缩。

性能指南#

本节假设广义的列优先数据布局(即,左侧的模具有最小的步幅)。以下大多数性能指南旨在促进更规则的内存访问模式

  • 尝试在所有张量中类似地排列张量的模(相对于步幅增加)。例如,\(C_{a,b,c} = A_{a,k,c} B_{k,b}\) 优于 \(C_{a,b,c} = A_{c,k,a} B_{k,b}\)

  • 尝试将批处理模保持为变化最慢的模(即,具有最大的步幅)。例如,\(C_{a,b,c,l} = A_{a,k,c,l} B_{k,b,l}\) 优于 \(C_{a,l,b,c} = A_{l,a,k,c} B_{k,l,b}\)

  • 尝试使变化最快的模(又名步幅为 1 的模)的范围尽可能大。

精度保证#

nvplTENSOR 使用其自己的计算类型来设置张量运算的浮点精度。nvpltensorComputeDescriptor_t 编码了在整个计算过程中保证的最小精度。由于这只是最小精度的保证,因此库可以选择比用户请求的精度更高的精度(例如,如果给定问题不支持该计算类型,或者有更多内核可供选择)。

nvplTENSOR 遵循 BLAS 关于 NaN 传播的约定:每当标量(alphabetagamma)设置为零时,将忽略缩放张量表达式中的 NaN,即来自标量的零优先于来自张量的 NaN。但是,来自张量的 NaN 遵循正常的 IEEE 754 行为。

为了说明,令 \(\alpha = 1; \beta = 0; A_{i, j} = 1; A'_{i, j} = 0; B_{i, j} = \textrm{NaN}\),则 \(\alpha A_{i,j} B_{i, j} = \textrm{NaN}\)\(\beta A_{i, j} B_{i, j} = 0\)\(\alpha A'_{i,j} B_{i, j} = \textrm{NaN}\)\(\beta A'_{i, j} B_{i, j} = 0\)

标量类型#

许多操作支持将参数乘以标量。该标量的类型是输出类型和计算类型的函数。下表列出了相应的类型

输出类型

nvpltensorComputeDescriptor_t

标量类型

NVPLTENSOR_R_32F

NVPLTENSOR_COMPUTE_DESC_32F

NVPLTENSOR_R_32F

NVPLTENSOR_R_64F

NVPLTENSOR_COMPUTE_DESC_64F

NVPLTENSOR_R_64F

NVPLTENSOR_C_32F

NVPLTENSOR_COMPUTE_DESC_32F

NVPLTENSOR_C_32F

NVPLTENSOR_C_64F

NVPLTENSOR_COMPUTE_DESC_64F

NVPLTENSOR_C_64F

支持的运算符#

nvplTENSOR 为 Element-wise Operations 支持多个一元和二元运算符。下表列出了相应的数据类型和运算符

日志记录#

可以通过在启动目标应用程序之前设置以下环境变量来启用 nvplTENSOR 中的日志记录机制

NVPLTENSOR_LOG_LEVEL=<level> - 其中 level 是以下级别之一

  • “0” - 关闭 - 日志记录已禁用(默认)

  • “1” - 错误 - 仅记录错误

  • “2” - 跟踪 - 启动 CUDA 内核的 API 调用将记录其参数和重要信息

  • “3” - 提示 - 可能提高应用程序性能的提示

  • “4” - 信息 - 提供有关库执行的常规信息,可能包含有关启发式状态的详细信息

  • “5” - API 跟踪 - API 调用将记录其参数和重要信息

NVPLTENSOR_LOG_MASK=<mask> - 其中 mask 是以下掩码的组合

  • “0” - 关闭

  • “1” - 错误

  • “2” - 跟踪

  • “4” - 提示

  • “8” - 信息

  • “16” - API 跟踪

NVPLTENSOR_LOG_FILE=<file_name> - 其中 file name 是日志文件的路径。文件名可能包含 %i,它将被进程 ID 替换。例如“<file_name>_%i.log”。

如果未定义 NVPLTENSOR_LOG_FILE,则日志消息将打印到 stdout。