关于张量核心 GEMM 实现的问题?
Question on tensor core GEMM implementation?
我正在阅读一些关于简单 GEMM 的张量核心 material 和相关代码。我有两个问题:
1、对D=A*B+C
使用tensor core时,将两个fp16矩阵4x4相乘并将乘积fp32矩阵加到fp32accumulator.Why两个fp16输入乘法A*B
得到fp32类型?
2、在代码example中,为什么需要比例因子alpha
和beta
?在示例中,它们设置为 2.0f
来自 NV 博客的代码片段:
for(int i=0; i < c_frag.num_elements; i++) {
c_frag.x[i] = alpha * acc_frag.x[i] + beta * c_frag.x[i];
}
在这种情况下,Tensorcore 设计者选择提供 FP32 累加选项,以便可以以更高的精度(更多的尾数位)和更大的范围来表示许多乘法累加步骤的结果(更多指数位)。这被认为对他们想要支持的整体计算问题很有价值,包括 HPC 和 AI 计算。两个 FP16 数的乘积可能无法在 FP16 中表示,而两个 FP16 数的更多或大多数乘积将在 FP32 中表示。
提供比例因子alpha
和beta
,以便提供的GEMM操作可以很容易地对应于众所周知的BLAS GEMM操作,该操作被广泛使用用于数值计算。这使得开发者可以更方便地使用 Tensorcore 的能力,在现有的数值计算代码中提供一个常用的计算范式。这也是 CUBLAS GEMM 实现提供这些可调参数的原因。
我正在阅读一些关于简单 GEMM 的张量核心 material 和相关代码。我有两个问题:
1、对D=A*B+C
使用tensor core时,将两个fp16矩阵4x4相乘并将乘积fp32矩阵加到fp32accumulator.Why两个fp16输入乘法A*B
得到fp32类型?
2、在代码example中,为什么需要比例因子alpha
和beta
?在示例中,它们设置为 2.0f
来自 NV 博客的代码片段:
for(int i=0; i < c_frag.num_elements; i++) {
c_frag.x[i] = alpha * acc_frag.x[i] + beta * c_frag.x[i];
}
在这种情况下,Tensorcore 设计者选择提供 FP32 累加选项,以便可以以更高的精度(更多的尾数位)和更大的范围来表示许多乘法累加步骤的结果(更多指数位)。这被认为对他们想要支持的整体计算问题很有价值,包括 HPC 和 AI 计算。两个 FP16 数的乘积可能无法在 FP16 中表示,而两个 FP16 数的更多或大多数乘积将在 FP32 中表示。
提供比例因子
alpha
和beta
,以便提供的GEMM操作可以很容易地对应于众所周知的BLAS GEMM操作,该操作被广泛使用用于数值计算。这使得开发者可以更方便地使用 Tensorcore 的能力,在现有的数值计算代码中提供一个常用的计算范式。这也是 CUBLAS GEMM 实现提供这些可调参数的原因。