Fortran 中元素向量乘法的最快实现是什么?

计算科学 线性代数 拉帕克
2021-12-26 16:24:34

我的 fortran 代码包含如下行

integer, parameter :: dbp = kind(1.0d0)
integer, parameter :: n = 1 000 000

real(dbp) :: x(n), y(n), z(n)

y(:) = x(:) * z(:)

我想利用(如果可能的话)一些优化的数学库来执行这个操作。我找到了一个 lapack 例程 dgbmv,它将矩阵乘以向量。如果我创建一个对角矩阵,这将满足我的需要

(y1y2yn)=(x1x2xn)(z1z2zn)

但我不知道这是否是计算 x(:)*z(:) 的最佳方法。有没有更合适的方法?

3个回答

与从内存加载数据(并将其写回)的成本相比,乘法的成本几乎是微不足道的如果您担心性能,您应该考虑数据局部性。值(如果可能的话)执行更多的触发器。xizi

设置对角矩阵充其量没有什么区别,但更有可能灾难性地降低性能。

您正在两个向量之间进行元素明智的操作,因此如果可能的话,最好使用为向量设计的函数。

Lapack是用于线性代数的,但它是为高度尊重这一基本操作的操作或方法而设计的。

对于代码的优化形式,您可以尝试使用 BlaisB 建议的一些编译器选项。

另一种方法是使用更基本的关卡库,类似Blas(注意 Lapack 是基于 Blas 构建的)。

例如,MKL 有v?mul执行向量-向量元素明智乘法。另请参阅 MKL 论坛中的这个问题

改写其他人所说的话,您可以将对角矩阵视为向量,这将减少存储它们所需的内存以及计算次数,除非您使用稀疏例程。您可以对其他结构化矩阵(如三对角矩阵)采用类似的方法。