gpt4 book ai didi

fortran - fortran 中的并行错误

转载 作者:行者123 更新时间:2023-12-01 22:22:30 25 4
gpt4 key购买 nike

program main
use omp_lib
implicit none
integer :: n=8
integer :: i, j, myid, a(8, 8), b, c(8)

! Generate a 8*8 array A
!$omp parallel default(none), private(i, myid), &
!$omp shared(a, n)
myid = omp_get_thread_num()+1
do i = 1, n
a(i, myid) = i*myid
end do
!$omp end parallel

! Array A
print*, 'Array A is'
do i = 1, n
print*, a(:, i)
end do

! Sum of array A
b = 0
!$omp parallel reduction(+:b), shared(a, n), private(i, myid)
myid = omp_get_thread_num()+1
do i = 1, n
b = b + a(i, myid)
end do
!$omp end parallel
print*, 'Sum of array A by reduction is ', b

b = 0
c = 0
!$omp parallel do
do i = 1, n
do j = 1, n
c(i) = c(i) + a(j, i)
end do
end do
!$omp end parallel do
print*, 'Sum of array A by using parallel do is', sum(c)

!$omp parallel do
do i = 1, n
do j = 1, n
b = b + a(j, i)
end do
end do
!$omp end parallel do
print*, 'Sum of array A by using parallel do in another way is', b

end program main

我在上面写了一段 Fortran 代码来实现 OpenMP 以三种不同的方式总结一个 8*8 数组中的所有元素。第一个使用减少和工作。其次,我创建了一个包含 8 个元素的一维数组。我总结了平行区域中的每一列,然后将它们相加。这也有效。第三个我用一个整数来总结数组中的每个元素,并将其放在并行的do区域中。这个结果是不正确的,每次都不同。我不明白为什么会出现这种情况。是因为没有指定public 和private 还是程序中变量b 被覆盖了?

最佳答案

在您的第三种情况下,b 上存在竞争条件:多个线程在没有适当的同步/私有(private)化的情况下读写同一个变量。

请注意,在第二种情况下您没有竞争条件:每个线程都在更新一些其他人无法访问的数据(即 c(i))。

最后,针对您上一个场景的一些解决方案:

  1. reducion(+:b) 子句添加到 pragma 中
  2. b = b + c(j,i) 表达式之前添加一个 pragma omp atomic 指令
  3. 您可以实现手动私有(private)化

关于fortran - fortran 中的并行错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133444/

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