gpt4 book ai didi

parallel-processing - 使用 gfortran 自动并行化

转载 作者:行者123 更新时间:2023-12-04 17:57:36 24 4
gpt4 key购买 nike

我正在尝试加速一个原本不是为并行计算而设计的相当冗长的程序。因此,我正在尝试使用 gfortran 进行自动并行化。

我有以下测试程序,基本上只是执行一些循环并测量执行时间:

program autoparallel

implicit none

integer :: N = 10000
double precision, allocatable :: A(:, :), X(:), Y(:)

integer :: i, j
integer :: time_start, time_finish, time_rate

call system_clock ( time_start, time_rate )

allocate( A(N, N), X(N), Y(N) )

do i=1, N
do j=1, N
A(i, j) = i * j
end do
end do

do i=1, N
X(i) = i
end do

do i=1, N
Y(i) = 0.d0
end do

do i=1, N
do j=1, N
Y(i) = Y(i) + A(j, i) * X(j)
end do
end do

call system_clock ( time_finish, time_rate )

write(*,*) 'Elapsed time: ', (time_finish-time_start)/real(time_rate), ' seconds'

write(*,*) Y(1), Y(N)

deallocate(A, X, Y)

end program autoparallel

我用不同的编译器标志执行了五次:

gfortran test.f90
4.14799976 seconds
4.51900005 seconds
4.42399979 seconds
4.15600014 seconds
4.38000011 seconds

gfortran -floop-parallelize-all -ftree-parallelize-loops=2 autoparallel.f90
4.36899996 seconds
4.07499981 seconds
4.35599995 seconds
4.17899990 seconds
4.37500000 seconds

gfortran -floop-parallelize-all -ftree-parallelize-loops=4 autoparallel.f90
4.28399992 seconds
4.42600012 seconds
4.19999981 seconds
4.33199978 seconds
4.14499998 seconds

gfortran -O3 autoparallel.f90
3.63599992 seconds
3.63599992 seconds
3.79800010 seconds
3.55900002 seconds
3.59599996 seconds

gfortran -O3 -floop-parallelize-all -ftree-parallelize-loops=4 autoparallel.f90
3.09299994 seconds
3.08299994 seconds
3.46799994 seconds
3.00099993 seconds
3.00699997 seconds

gfortran -O3 -floop-nest-optimize autoparallel.f90
1.03100002 seconds
1.01800001 seconds
1.02300000 seconds
1.03600001 seconds
0.947000027 seconds

所以基本上执行时间与线程数持平。只有在优化之后,自动并行化才会开始。我试图理解这是为什么。

至少所有的 i 循环都可以分布在多个线程上而无需任何优化。

那么这里到底发生了什么?还有其他编译器标志可以用来进一步加速程序吗?哪些标志会与我的并行化目标相冲突?

-floop-nest-optimize 不能与 -floop-parallelize-all 一起使用。错误:

isl_constraint.c:497: position out of bounds

最佳答案

我发现第三个循环通常通过 OpenMP REDUCTION(或 !DIR$ DO SIMD reduction on ifort)得到改进。

USE OMPLIB
....
do i=1, N
!$OMP DO SIMD REDUCTION(+:Y)
do j=1, N
Y(i) = Y(i) + A(j, i) * X(j)
end do
end do

通过一些工作,也许 Y(I) 可以是 PRIVATE 以在 I 循环上并行。除非工作负载很高,否则对于这些简单的情况,并行化 I 循环很少能带来如此多的改进。

YRMV

关于parallel-processing - 使用 gfortran 自动并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38883411/

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