Julia : BLAS. gemm!() 参数

标签 julia blas

我想使用 BLAS 包。为此,gemm() 函数的前两个参数的含义对我来说并不明显。 参数'N''T'代表什么?

 BLAS.gemm!('N', 'T', lr,  alpha, A, B, beta, C)

BLAS.gemmBLAS.gemm! 之间有什么区别?

最佳答案

根据documentation

gemm!(tA, tB, alpha, A, B, beta, C)

Update C as alpha * A * B + beta*C or the other three variants according to tA (transpose A) and tB. Returns the updated C.

注意:这里,alphabeta必须是float类型标量。 ABC 都是矩阵。由您来确保矩阵尺寸匹配。

因此,tAtB 参数表示您要将转置操作应用于 A 还是 B 相乘之前。请注意,这将花费您一些计算时间和分配 - 转置不是免费的。 (因此,如果您要多次应用乘法,每次都使用相同的转置规范,那么最好从一开始就将矩阵存储为转置版本)。选择 N 表示不转置,选择 T 表示转置。您必须选择其中之一。

gemm!()gemv!() 之间的区别在于,对于 gemm!() 您已经需要分配矩阵C! 是“就地修改”信号。请考虑以下它们不同用途的说明:

A = rand(5,5)
B = rand(5,5)
C = Array(Float64, 5, 5)

BLAS.gemm!('N', 'T', 1.0, A, B, 0.0, C)
D = BLAS.gemm('N', 'T', 1.0, A, B)

julia> C == D
true

本质上,这些都执行计算 C = A * B'。 (从技术上讲,gemm!() 执行 C = (0.0)*C + (1.0)*A * B'。)

因此,就地修改的语法 gemm!() 在某些方面有点不寻常(除非您已经使用过像 C 这样的语言,在这种情况下它看起来非常直观) 。您没有像在 Julia 这样的高级面向对象语言中调用函数来赋值时经常使用的显式 = 符号。

如上图所示,在这种情况下,gemm!()gemm() 的结果是相同的,尽管实现该结果的语法和过程相同有点不同。然而,实际上,两者之间的性能差异可能很大,具体取决于您的用例。特别是,如果您要多次执行乘法运算,每次都替换/更新 C 的值,那么 gemm!() 可能是一个不错的选择更快,因为您不需要每次都重新分配新内存,这确实会产生时间成本,无论是在初始内存分配中还是在稍后的垃圾回收中。

关于Julia : BLAS. gemm!() 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38481674/

相关文章:

julia - 分阶段编程——Jake Bolewski 的演讲

python - 什么是 julia 中的 ".=="以及它在 python 中的等价物?

linear-algebra - 什么时候使用 eigen 什么时候使用 Blas

r - 绕过 'BLAS/LAPACK routine ' DGEBAL'在CNmixt fn(ContaminatedMixt pkg)中给出了错误代码-3'

c++ - "error LINK2019: unresolved..."

java - 将 jBLAS 与 NVBLAS 结合使用

r - 安装 BLAS/ATLAS/MKL/OPENBLAS 会加速用 C/C++ 编写的 R 包吗?

julia - Machine 中 X 的 scitype 与模型不兼容

performance - Julia 1.0 中的缓慢(重复)矩阵乘法

machine-learning - 我的简单 Julia-Flux 密集模型中出现奇怪且无信息的错误