主题:并行计算时各个线程同时调用具有common数据共享的子程序问题。
本人刚开始尝试并行计算。
平台是vs2005+ivf9.1,openmp语言, windows xp平台。 双核cpu。
在进行 parallel do 操作时,原则是各个循环之间无关系。
现在我是程序里,循环的主体是调用子程序A,而A又调用子程序B,C,D等。子程序B,C,D间应用common 语句共享数据。 在多进程同时执行程序A时,B,C,D程序的common公共数据区就会被多个进程使用,使数据混乱。
请问如何避免此问题,谢谢!
举个例子来说,如下的程序,/aa/地址的数据会因为2个线程的同时使用而使值不正确:
implicit none
INCLUDE "omp_lib.h" ! or USE OMP_LIB
INTEGER i,j,jk,ij
common /aa/ jk,ij
!$OMP PARALLEL DO NUM_THREADS(2)
do i=1,2
call A1(i,j)
PRINT *, "THREAD# ", OMP_GET_THREAD_NUM(), "i = ", i, "j = ", j
enddo
!$OMP END PARALLEL DO
END
SUBROUTINE A1(i,j)
implicit none
INTEGER i,j,jk,ij
common /aa/ jk,ij
jk=i
call A2
j=ij
END
SUBROUTINE A2
implicit none
INTEGER i,j,jk,ij
common /aa/ jk,ij
ij=jk*10
END
平台是vs2005+ivf9.1,openmp语言, windows xp平台。 双核cpu。
在进行 parallel do 操作时,原则是各个循环之间无关系。
现在我是程序里,循环的主体是调用子程序A,而A又调用子程序B,C,D等。子程序B,C,D间应用common 语句共享数据。 在多进程同时执行程序A时,B,C,D程序的common公共数据区就会被多个进程使用,使数据混乱。
请问如何避免此问题,谢谢!
举个例子来说,如下的程序,/aa/地址的数据会因为2个线程的同时使用而使值不正确:
implicit none
INCLUDE "omp_lib.h" ! or USE OMP_LIB
INTEGER i,j,jk,ij
common /aa/ jk,ij
!$OMP PARALLEL DO NUM_THREADS(2)
do i=1,2
call A1(i,j)
PRINT *, "THREAD# ", OMP_GET_THREAD_NUM(), "i = ", i, "j = ", j
enddo
!$OMP END PARALLEL DO
END
SUBROUTINE A1(i,j)
implicit none
INTEGER i,j,jk,ij
common /aa/ jk,ij
jk=i
call A2
j=ij
END
SUBROUTINE A2
implicit none
INTEGER i,j,jk,ij
common /aa/ jk,ij
ij=jk*10
END