BLAS/cuBLAS 如何在他们的例程中处理 alpha 和 beta 因素?
How do do BLAS/cuBLAS treat the factors alpha and beta in their routines?
许多线性代数例程都将常量(例如 alpha 和 beta)作为参数。例如 cublas?GEMM 执行以下操作:
C := alpha*op( A )op( B ) + betaC
假设我将 beta 设置为 0。
cuBLAS 还会执行不必要的标量-矩阵乘法和矩阵-矩阵加法吗? BLAS/LAPACK/MKL 等其他库呢?
如果没有执行必要的操作:我需要做些什么来确保这一点,还是自动避免?
alpha/beta 是否有其他值可以进行其他优化?例如,假设我改为设置 beta=1,是否会跳过 beta 操作的缩放?
为什么cuBLAS documentation and BLAS documentation specify these factors in DGEMM as const double
but in examples一个double
值传给他们?有什么区别?
如果这些库确实以我描述的方式浪费操作,我会感到惊讶,但除了 cuBLAS 文档提到的以外,我没有在任何地方找到关于它的明确讨论:
if beta == 0 then C does not have to be a valid input.
即使是参考实现也在这里进行了优化。无论 alpha 或 beta 的值如何,都没有认真执行操作。
- 不,不会。
- N/A
- 只留下
beta=0.
忽略 C。beta=1.
跳过缩放
- 原因是与 FORTRAN 的兼容性。在 F90 之前的 FORTRAN 中没有
const
变量。 BLAS 接口是在 F90 之前定义的,每个人都遵守约定。我想拥有一个带有适当关键字的 C 接口,请查看特定于 C 的接口,例如 sblas_dgemm
.
这里是 DGEMM
的参考实现。
http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f_source.html。查找 Quick return if possible.
、And if alpha.eq.zero.
等
许多线性代数例程都将常量(例如 alpha 和 beta)作为参数。例如 cublas?GEMM 执行以下操作:
C := alpha*op( A )op( B ) + betaC
假设我将 beta 设置为 0。
cuBLAS 还会执行不必要的标量-矩阵乘法和矩阵-矩阵加法吗? BLAS/LAPACK/MKL 等其他库呢?
如果没有执行必要的操作:我需要做些什么来确保这一点,还是自动避免?
alpha/beta 是否有其他值可以进行其他优化?例如,假设我改为设置 beta=1,是否会跳过 beta 操作的缩放?
为什么cuBLAS documentation and BLAS documentation specify these factors in DGEMM as
const double
but in examples一个double
值传给他们?有什么区别?
如果这些库确实以我描述的方式浪费操作,我会感到惊讶,但除了 cuBLAS 文档提到的以外,我没有在任何地方找到关于它的明确讨论:
if beta == 0 then C does not have to be a valid input.
即使是参考实现也在这里进行了优化。无论 alpha 或 beta 的值如何,都没有认真执行操作。
- 不,不会。
- N/A
- 只留下
beta=0.
忽略 C。beta=1.
跳过缩放 - 原因是与 FORTRAN 的兼容性。在 F90 之前的 FORTRAN 中没有
const
变量。 BLAS 接口是在 F90 之前定义的,每个人都遵守约定。我想拥有一个带有适当关键字的 C 接口,请查看特定于 C 的接口,例如sblas_dgemm
.
这里是 DGEMM
的参考实现。
http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f_source.html。查找 Quick return if possible.
、And if alpha.eq.zero.
等