如何让每个线程都知道openmp中的变量值

How to make each thread aware of a variable value in openmp

下面的虚拟代码来自我 运行.

的 Fortran 应用程序

我的问题是调用subroutine_a时,j没有取到正确的值。

!$omp parallel do
do i = 1, limit
    j = i+k
    call subroutine_a(j)
end do
!$omp end parallel do

如果是运行,例如4个线程,每个线程必须有j=1j=2j=3j=4。现在 j 在所有 4 个线程中可能是 1

您遇到的情况称为竞争条件。所有线程写入同一个共享变量 j 所以它或多或少是随机的,哪些值将被赋予子例程。

您有两种可能解决此问题:

  1. 完全避免它(如果可以的话,即如果以后不再使用 j):
!$omp parallel do
do i = 1, limit
    call subroutine_a(i+k)
end do
!$omp end parallel do
  1. 声明 j 私有,s.t。每个线程都有自己的 j:
  2. 版本
!$omp parallel do private(j)
do i = 1, limit
    j = i+k
    call subroutine_a(j)
end do
!$omp end parallel do

我觉得i也需要保密...