回 帖 发 新 帖 刷新版面

主题:并行计算时各个线程同时调用具有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

回复列表 (共3个回复)

沙发

每此循环都改动公用变量, 真的能保证循环之间独立吗?

板凳


确实存在楼上说的这个问题。

目前我想到了一个解决的方法。 就是让每个线程读取不同的程序,这里的不同指的是公共区域名称变化了,程序的作用是相同的。

3 楼

这个循环的并行重要吗? 如果循环既有数据竞争又要顺序执行, 那还是不并行好了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册