OpenMP atomic and critical이 올바른 결과를 제공하지 않는 이유는 무엇입니까?

user15964

나는 시험에 다음 포트란 코드를 작성했습니다 atomiccritical

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잘못된 것입니다. 이것은 이상합니다. 나는 그들을 추가하면 경주 조건을 피할 수 있다고 생각했습니다. 그러나 동기화가없는 첫 번째 루프가 정답을줍니다. 여기에 경주가 없습니까? 내 코드에 어떤 문제가 있습니까?

블라디미르 F

코드의 문제는 경쟁 조건입니다.

   !$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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C 함수가 올바른 결과를 반환하지만 return 문이 제공되지 않는 이유는 무엇입니까?

분류에서Dev

내 간단한 Rails form_tag 검색 양식이 올바른 방법을 사용하여 결과를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

이 코드가 올바른 결과를 반환하지 않는 이유는 무엇입니까?

분류에서Dev

내 indexOf 값이 올바른 결과를 반환하지 않는 이유는 무엇입니까?

분류에서Dev

copy_to_user가 올바른 결과를 인쇄하지 않는 이유는 무엇입니까?

분류에서Dev

한 코드가 firebase에서 올바른 키를 제공하고 다른 코드는 제공하지 않는 이유는 무엇입니까?

분류에서Dev

이 코드 (Matlab의 MEX 파일에서 OpenMP 사용)가 다른 결과를 제공하는 이유는 무엇입니까?

분류에서Dev

"cgps -s"가 결과를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

올바른 바이트 수를 할당하지 않고 malloc이 작동하는 이유는 무엇입니까?

분류에서Dev

이 자바 스크립트가 다른 결과를 제공하는 이유는 무엇입니까?

분류에서Dev

이 코드가 올바른 출력을 제공하지 않는 이유는 무엇입니까?

분류에서Dev

SQL 준비 문이 올바른 응답을 제공하지 않는 이유는 무엇입니까?

분류에서Dev

countifs 결합 기준이 예상과 다른 결과를 제공하는 이유는 무엇입니까?

분류에서Dev

exec ()의 ping이 올바른 결과를 제공하지 않음

분류에서Dev

Dell EMC PowerVault ME4 4024가 올바른 양의 스토리지를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

Srand Seed가 결과를 바꾸지 않는 이유는 무엇입니까?

분류에서Dev

'그룹'과 '그룹 [내 이름]'이 다른 결과를 제공하는 이유는 무엇입니까?

분류에서Dev

스택을 사용하는 dfs가 올바른 결과를 제공하지 않는 이유

분류에서Dev

Rails to_json이 Ruby to_json과 다른 결과를 제공하는 이유는 무엇입니까?

분류에서Dev

루프가 누적되는 것과 다른 결과를 제공하는 이유는 무엇입니까?

분류에서Dev

이 Firebase Function Promise가 올바른 오류를 반환하지 않는 이유는 무엇입니까?

분류에서Dev

getservbyname이 올바른 포트 번호를 반환하지 않는 이유는 무엇입니까?

분류에서Dev

이 코드가 올바른 해시를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

내 기능이 올바른 경로를 참조하지 않는 이유는 무엇입니까?

분류에서Dev

플롯이 x 축에 올바른 범위를 표시하지 않는 이유는 무엇입니까?

분류에서Dev

내 코드가 올바른 최소 차이를 인쇄하지 않는 이유는 무엇입니까?

분류에서Dev

올바른 방법으로 읽기가 일관된 결과를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

이 Ansi C 프로그램이 결과를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

이러한 코드 블록이 동일한 결과를 제공하지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    C 함수가 올바른 결과를 반환하지만 return 문이 제공되지 않는 이유는 무엇입니까?

  2. 2

    내 간단한 Rails form_tag 검색 양식이 올바른 방법을 사용하여 결과를 제공하지 않는 이유는 무엇입니까?

  3. 3

    이 코드가 올바른 결과를 반환하지 않는 이유는 무엇입니까?

  4. 4

    내 indexOf 값이 올바른 결과를 반환하지 않는 이유는 무엇입니까?

  5. 5

    copy_to_user가 올바른 결과를 인쇄하지 않는 이유는 무엇입니까?

  6. 6

    한 코드가 firebase에서 올바른 키를 제공하고 다른 코드는 제공하지 않는 이유는 무엇입니까?

  7. 7

    이 코드 (Matlab의 MEX 파일에서 OpenMP 사용)가 다른 결과를 제공하는 이유는 무엇입니까?

  8. 8

    "cgps -s"가 결과를 제공하지 않는 이유는 무엇입니까?

  9. 9

    올바른 바이트 수를 할당하지 않고 malloc이 작동하는 이유는 무엇입니까?

  10. 10

    이 자바 스크립트가 다른 결과를 제공하는 이유는 무엇입니까?

  11. 11

    이 코드가 올바른 출력을 제공하지 않는 이유는 무엇입니까?

  12. 12

    SQL 준비 문이 올바른 응답을 제공하지 않는 이유는 무엇입니까?

  13. 13

    countifs 결합 기준이 예상과 다른 결과를 제공하는 이유는 무엇입니까?

  14. 14

    exec ()의 ping이 올바른 결과를 제공하지 않음

  15. 15

    Dell EMC PowerVault ME4 4024가 올바른 양의 스토리지를 제공하지 않는 이유는 무엇입니까?

  16. 16

    Srand Seed가 결과를 바꾸지 않는 이유는 무엇입니까?

  17. 17

    '그룹'과 '그룹 [내 이름]'이 다른 결과를 제공하는 이유는 무엇입니까?

  18. 18

    스택을 사용하는 dfs가 올바른 결과를 제공하지 않는 이유

  19. 19

    Rails to_json이 Ruby to_json과 다른 결과를 제공하는 이유는 무엇입니까?

  20. 20

    루프가 누적되는 것과 다른 결과를 제공하는 이유는 무엇입니까?

  21. 21

    이 Firebase Function Promise가 올바른 오류를 반환하지 않는 이유는 무엇입니까?

  22. 22

    getservbyname이 올바른 포트 번호를 반환하지 않는 이유는 무엇입니까?

  23. 23

    이 코드가 올바른 해시를 생성하지 않는 이유는 무엇입니까?

  24. 24

    내 기능이 올바른 경로를 참조하지 않는 이유는 무엇입니까?

  25. 25

    플롯이 x 축에 올바른 범위를 표시하지 않는 이유는 무엇입니까?

  26. 26

    내 코드가 올바른 최소 차이를 인쇄하지 않는 이유는 무엇입니까?

  27. 27

    올바른 방법으로 읽기가 일관된 결과를 생성하지 않는 이유는 무엇입니까?

  28. 28

    이 Ansi C 프로그램이 결과를 제공하지 않는 이유는 무엇입니까?

  29. 29

    이러한 코드 블록이 동일한 결과를 제공하지 않는 이유는 무엇입니까?

뜨겁다태그

보관