gpt4 book ai didi

parallel-processing - gfortran 是否利用了 DO CONCURRENT?

转载 作者:行者123 更新时间:2023-12-04 04:38:10 25 4
gpt4 key购买 nike

我目前正在使用 gfortran 4.9.2,我想知道编译器是否真的知道如何利用 DO CONCURRENT 构造(Fortran 2008)。我知道编译器“支持”它,但不清楚这意味着什么。例如,如果打开了自动并行化(指定了一定数量的线程),编译器是否知道如何并行化 do 并发循环?

编辑:如评论中所述,this previous question在 SO 上与我的非常相似,但它是从 2012 年开始的,只有最新版本的 gfortran 实现了现代 Fortran 的最新功能,所以我认为有必要询问 2015 年编译器的当前状态。

最佳答案

DO CONCURRENT 而不是明确启用某些新功能在 gfortran 中似乎对程序员施加了限制,以便在需要时隐式允许循环并行化(使用选项 -ftree-parallelize-loops=NPROC )。

而一个 DO loop 可以包含任何函数调用,DO CONCURRENT 的内容仅限于 PURE功能(即没有副作用)。因此,当人们尝试使用时,例如 RANDOM_NUMBER (这不是 PURE 因为它需要保持发电机的状态)在 DO CONCURRENT , gfortran 会抗议:

prog.f90:25:29:

25 | call random_number(x)
| 1
Error: Subroutine call to intrinsic ‘random_number’ in DO CONCURRENT block at (1) is not PURE

否则, DO CONCURRENT行为正常 DO .它只强制使用可并行化的代码,因此 -ftree-parallelize-loops=NPROC成功。例如,使用 gfortran 9.1 和 -fopenmp -Ofast -ftree-parallelize-loops=4 ,均标 DO和 F08 DO CONCURRENT以下程序中的循环在 4 个线程中运行,并且时间几乎相同:
program test_do

use omp_lib, only: omp_get_wtime

integer, parameter :: n = 1000000, m = 10000
real, allocatable :: q(:)

integer :: i
real :: x, t0

allocate(q(n))

t0 = omp_get_wtime()
do i = 1, n
q(i) = i
do j = 1, m
q(i) = 0.5 * (q(i) + i / q(i))
end do
end do
print *, omp_get_wtime() - t0

t0 = omp_get_wtime()
do concurrent (i = 1:n)
q(i) = i
do j = 1, m
q(i) = 0.5 * (q(i) + i / q(i))
end do
end do
print *, omp_get_wtime() - t0

end program test_do

关于parallel-processing - gfortran 是否利用了 DO CONCURRENT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29928293/

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