我现在正在编写一些代码,并且我有一个matmul
的占位符似乎工作得很好,但我想使用LAPACK
dgemm
实现。我现在只使用gfortran
并使用matmul
获得非常好的速度,但我想知道我是否可以变得更好。
目前的电话是:
C = transpose(matmul( transpose(A), B))
其中A
,B
和C
是非正方形double precision
矩阵。我可以使用dgemm
的当前gfortran
实现轻松编写LAPACK
的包装器,但我喜欢我可以将所有这些都作为一个函数执行(而不是担心call
对于一个surbroutine并且必须处理transpose
)。
我想知道我是否使用ifort
进行编译并添加MKL
,这个matmul
会为我神奇地改为MKL
dgemm
函数包装器?
答案 0 :(得分:11)
你不希望所有的MATMUL都是dgemm,对于非常小的矩阵来说它是无利可图的。
Gfortran做你想做的事
-fexternal-BLAS 这个选项将使gfortran为MATMUL等一些矩阵运算生成BLAS函数调用,而不是使用我们自己的 算法,如果涉及的矩阵的大小大于a 给定限制(参见-fblas-matmul-limit)。如果是,这可能是有利可图的 优化的供应商BLAS库可用。 BLAS库将有 在链接时指定。
你甚至可以通过-fblas-matmul-limit = n来改变切换到BLAS的大小限制
你可以在gfortran中以这种方式轻松使用MKL。
英特尔Fortran有类似的东西
[无 - ] opt-matmul此选项启用[禁用]编译器 - 通过识别矩阵乘法循环嵌套(如果有)生成Matrix Multiply(matmul)库调用,并将其替换为 matmul库要求提高性能。此选项已启用 默认情况下,如果选项/ O3( - O3)和/ Qparallel( - 并行)指定。除非选项/ O2,否则此选项无效( - 设置O2)或更高。