gpt4 book ai didi

performance - 在 Fortran 中对多个矩阵进行加权和求和的最有效方法

转载 作者:行者123 更新时间:2023-12-02 05:07:07 24 4
gpt4 key购买 nike

我正在尝试用 Fortran 语言编写一个函数,将多个具有不同权重的矩阵相乘,然后将它们相加形成一个矩阵。我已经确定这个过程是我程序中的瓶颈(对于单次程序运行,这个权重将多次,具有不同的权重)。现在我正试图通过从 Matlab 切换到 Fortran 来让它运行得更快。我是 Fortran 的新手,非常感谢所有帮助。

在 Matlab 中,我发现进行此类计算的最快方法如下所示:

function B = weight_matrices()
n = 46;
m = 1800;
A = rand(n,m,m);
w = rand(n,1);
tic;
B = squeeze(sum(bsxfun(@times,w,A),1));
toc;

分配 B 的行在我的机器上运行大约 0.9 秒(Matlab R2012b,MacBook Pro 13"retina,2.5 GHz Intel Core i5,8 GB 1600 MHz DDR3)。它应该是请注意,对于我的问题,张量 A 在程序的整个运行过程中(初始化后)将是相同的(常数),但 w 可以取任何值。此外, 的典型值nm 在这里使用,这意味着张量 A 的内存大小约为 1 GB。

我能想到的用 Fortran 编写的最清晰的方式是这样的:

pure function weight_matrices(w,A) result(B)
implicit none
integer, parameter :: n = 46
integer, parameter :: m = 1800
double precision, dimension(num_sizes), intent(in) :: w
double precision, dimension(num_sizes,msize,msize), intent(in) :: A
double precision, dimension(msize,msize) :: B
integer :: i
B = 0
do i = 1,n
B = B + w(i)*A(i,:,:)
end do
end function weight_matrices

当使用 gfortran 4.7.2 编译时,使用 -O3(函数调用计时为“call cpu_time(t)”),此函数运行大约 1.4 秒。如果我手动将循环展开为

B = w(1)*A(1,:,:)+w(2)*A(2,:,:)+ ... + w(46)*A(46,:,:)

该函数运行大约需要 0.11 秒。这很棒,意味着与 Matlab 版本相比,我的速度提高了大约 8 倍。但是,我仍然对可读性和性能有一些疑问。

首先,我想知道是否有更快的方法来执行矩阵的加权和求和。我查看了 BLAS 和 LAPACK,但找不到任何似乎合适的功能。我还尝试将维度放在 A 中,该维度将枚举矩阵作为最后一个维度(即从 (i,j,k) 切换到 (k, i,j) 用于元素),但这导致代码变慢。

其次,这个快速版本不是很灵活,实际上看起来很丑陋,因为如此简单的计算需要这么多文本。对于我正在运行的测试,我想尝试使用不同数量的权重,以便 w 的长度会有所不同,以查看它如何影响我的算法的其余部分。然而,这意味着我每次都非常繁琐地重写 B 的赋值。有什么方法可以使它更灵活,同时保持性能相同(或更好)?

第三,如前所述,张量 A 在程序运行期间将保持不变。我在我的程序中使用它们自己的模块中的“参数”属性设置了常量标量值,将它们与“使用”表达式一起导入到需要它们的函数/子例程中。对张量 A 执行等效操作的最佳方法是什么?我想告诉编译器这个张量在 init. 之后将是常量,以便可以进行任何相应的优化。请注意,A 的大小通常约为 1 GB,因此直接在源文件中输入它是不切实际的。

提前感谢您的任何意见! :)

最佳答案

也许你可以尝试类似的东西

    do k=1,m
do j=1,m
B(j,k)=sum( [ ( (w(i)*A(i,j,k)), i=1,n) ])
enddo
enddo

方括号是 (//) 的更新形式,一维矩阵(向量)。 sum 中的项是维度为 (n) 的矩阵,sum 对所有这些元素求和。这正是您展开的代码所做的(并且不完全等于您拥有的 do 循环)。

关于performance - 在 Fortran 中对多个矩阵进行加权和求和的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com