0

基本的な質問があります。以下のコードでは、同じ関数「add」を 2 回呼び出しています。OpenMP を使用してこれを行うと、間違った結果が得られます。

program p
integer::i,j,omp_get_thread_num,n
real::suma
i=5
j=10

!$omp parallel num_threads(2) private(n)

n=omp_get_thread_num()

if(n==0) goto 1111

suma=add(i,n)

write(*,*)'sum for 5=',suma,n,i

goto 1000

1111 suma=add(j,n)

write(*,*)'sum for 10=',suma,n,j

1000 continue

!$omp end parallel

end program p
!----------------------------------------

function add(k,n)result(l)

implicit none

integer::k,s,n

real::l1,l

!write(*,*)'thread employing me is:',n

l1=0.0

do s=k,k+5

l1=l1+s

end do

l=l1

return

end function add

このコードを実行した結果は次のとおりです。

sum for 10=   45.0000000               0          10

sum for 5=   45.0000000               1           5

ただし、22 行目のコメントを外すと、つまり '!write( , )'thread Employment me is:',n' となります。

結果は次のとおりです。

 thread employing me is:           0

 sum for 10=   75.0000000               0          10

 thread employing me is:           1

 sum for 5=   45.0000000               1           5

異なるスレッドを使用して同じ関数を正しく使用するにはどうすればよいですか (つまり、変数を混同することなく) 得られた結果を説明できる人はいますか?

これは私の実際の問題の単純化されたバージョンです。(スレッドで同じ関数を使用している場所)

編集: わかりました、プライベート リストに「suma」を含めないという非常にばかげた間違いに気付きました。それでも、suma が非公開にされていなくても、22 行目のコメントを外すと、常に正しい結果が得られる理由を誰か教えてもらえますか?

4

1 に答える 1