나는 시험에 다음 포트란 코드를 작성했습니다 atomic
및critical
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
출력은
그것은의 결과를 의미 atomic
하고 critical
잘못된 것입니다. 이것은 이상합니다. 나는 그들을 추가하면 경주 조건을 피할 수 있다고 생각했습니다. 그러나 동기화가없는 첫 번째 루프가 정답을줍니다. 여기에 경주가 없습니까? 내 코드에 어떤 문제가 있습니까?
코드의 문제는 경쟁 조건입니다.
!$omp parallel
...
a=atmp
b=btmp
...
!$omp end parallel
모든 스레드가 해당 작업을 수행하고 충돌합니다. omp single
이 선 주위를 원합니다 .
당신은 어떤 필요하지 않습니다 atomic
또는 critical
에서을
!$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
잠재적 경쟁 조건을 보호해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다