如何让每个线程都知道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=1
、j=2
、j=3
、j=4
。现在 j
在所有 4 个线程中可能是 1
。
您遇到的情况称为竞争条件。所有线程写入同一个共享变量 j
所以它或多或少是随机的,哪些值将被赋予子例程。
您有两种可能解决此问题:
- 完全避免它(如果可以的话,即如果以后不再使用
j
):
!$omp parallel do
do i = 1, limit
call subroutine_a(i+k)
end do
!$omp end parallel do
- 声明
j
私有,s.t。每个线程都有自己的 j
: 版本
!$omp parallel do private(j)
do i = 1, limit
j = i+k
call subroutine_a(j)
end do
!$omp end parallel do
我觉得i
也需要保密...
下面的虚拟代码来自我 运行.
的 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=1
、j=2
、j=3
、j=4
。现在 j
在所有 4 个线程中可能是 1
。
您遇到的情况称为竞争条件。所有线程写入同一个共享变量 j
所以它或多或少是随机的,哪些值将被赋予子例程。
您有两种可能解决此问题:
- 完全避免它(如果可以的话,即如果以后不再使用
j
):
!$omp parallel do
do i = 1, limit
call subroutine_a(i+k)
end do
!$omp end parallel do
- 声明
j
私有,s.t。每个线程都有自己的j
: 版本
!$omp parallel do private(j)
do i = 1, limit
j = i+k
call subroutine_a(j)
end do
!$omp end parallel do
我觉得i
也需要保密...