gpt4 book ai didi

fortran - 为什么 OpenMP 原子性和关键性不能给出正确的结果?

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

我编写了以下 Fortran 代码来测试原子关键

program test
implicit none
integer::i
integer::a(10),b(10),atmp(10),btmp(10)
a=[1,2,3,4,5,6,7,8,9,10]
b=[12,32,54,77,32,19,34,1,75,45]
atmp=a
btmp=b
write(*,'(1X,10I4)') a+b
print*,'------------------'
!$omp parallel
!$omp do
do i=1,10
B(I) = B(I)+A(I)
end do
!$omp end do
!$omp single
write(*,'(1X,10I4)') b
!$omp end single

a=atmp
b=btmp
!$omp do
do i=1,10
!$omp critical
B(I) = B(I)+A(I)
!$omp end critical
end do
!$omp end do
!$omp single
write(*,'(1X,10I4)') b
!$omp end single

a=atmp
b=btmp
!$omp do
do i=1,10
!$omp atomic
B(I) = B(I)+A(I)
!$omp end atomic
end do
!$omp end do
!$omp single
write(*,'(1X,10I4)') b
!$omp end single

!$omp end parallel
end program

输出为

enter image description here

这意味着atomicritic的结果是错误的。这很奇怪,我认为添加它们可以避免赛车状况。然而,没有同步的第一个循环给出了正确的答案,这里没有赛车吗?我的代码有什么问题吗?

最佳答案

代码中的问题是竞争条件

   !$omp parallel

...
a=atmp
b=btmp
...
!$omp end parallel

所有线程都执行该操作,并且它们会发生冲突。您希望在这些行周围omp single

您不需要任何原子关键

!$omp do
do i=1,10
B(I) = B(I)+A(I)
end do
!$omp end do

因为每个线程都对不同的数组元素进行操作。

在 OpenMP 规范的示例中,问题在于

!$OMP   PARALLEL DO SHARED(X, Y, INDEX, N)
DO I=1,N
!$OMP ATOMIC UPDATE
X(INDEX(I)) = X(INDEX(I)) + WORK1(I)

数组或函数 INDEX(I) 可以为具有不同 I 的两个不同线程返回相同的值,您必须保护这种潜在的竞争条件。

关于fortran - 为什么 OpenMP 原子性和关键性不能给出正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36182486/

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