回 帖 发 新 帖 刷新版面

主题:Fortran + OpenMP 的问题,串并行结果不同。

以下这段代码,串行和使用OpenMP执行的结果不同,大家看看我这样使用OpenMP有没有什么问题吗?
数组全部是共享的,因为多个线程操作的是数组的不同部分,所以应该没有问题吧。谢谢了。



!$OMP PARALLEL PRIVATE(temp)
!$OMP DO
      DO K=1,KMAX
      DO J=2,JMAX
      DO I=2,IMAX

      temp=
     &    (.25E0*(DT(I-1,J)+DT(I,J))*(DY(I,J)+DY(I-1,J))*U(I,J,K))*DZ(K)
    Array_1(I,J,K) = temp
      IF (U(I,J,K)>=0.) THEN
     XArray(I,J,K) = temp*F(I-1,J,K)
    ELSE
     XArray(I,J,K) = temp*F(I,J,K)
    ENDIF
        
    temp=
     &    (.25E0*(DT(I,J-1)+DT(I,J))*(DX(I,J)+DX(I,J-1))*V(I,J,K))*DZ(K)
    Array_2(I,J,K)= temp
    IF(V(I,J,K)>=0.) THEN
      YArray(I,J,K) = temp*F(I,J-1,K)
    ELSE
      YArray(I,J,K) = temp*F(I,J,K)
    ENDIF

    IF(K>1) THEN
        temp = DX(I,J)*DY(I,J)*W(I,J,K)
        Array_3(I,J,K) = temp
    IF( W(I,J,K) >= 0.) THEN
    
        ZArray(I,J,K) = temp*F(I,J,K)    
    ELSE

        ZArray(I,J,K) = temp*F(I,J,K-1)
    ENDIF        
    ENDIF

    ENDDO
    ENDDO
    ENDDO
!$OMP END DO
!$OMP END PARALLEL

回复列表 (共15个回复)

沙发

!$OMP PARALLEL PRIVATE(temp,K,I,J)
试试看?

板凳

循环迭代变量应该不能出现在pirvate列表里面吧,我看过一本书是这样说的。一会我试试你说的,谢谢啊。

3 楼

K,I,J 不是迭代的共享变量, 他们只是指标. 如果指标共享,那线程就对同一个指标进行计算, 你觉得对不对? 
况且进入循环的时候指标是会进行赋值的,这时候若指标共用就会数据冲突.

4 楼

[quote]K,I,J 不是迭代的共享变量, 他们只是指标. 如果指标共享,那线程就对同一个指标进行计算, 你觉得对不对? 
况且进入循环的时候指标是会进行赋值的,这时候若指标共用就会数据冲突.[/quote]

按照这个!$OMP PARALLEL PRIVATE(temp,K,I,J)试验了一下,结果还是错误的,不知道是哪里出了问题啊。

5 楼

你这个代码里面没有函数吧? 如果没我看不出哪里出问题了. 慢慢调试一下吧.

6 楼

[quote]你这个代码里面没有函数吧? 如果没我看不出哪里出问题了. 慢慢调试一下吧.[/quote]
没有函数的。我再调试一下吧。

7 楼

楼主上网找:
伪共享
吧。。。这是一个很纠结的事儿。

8 楼

[quote]楼主上网找:
伪共享
吧。。。这是一个很纠结的事儿。[/quote]

程序中并没有对数组中相同位置进行写操作啊。。

9 楼

[quote][quote]楼主上网找:
伪共享
吧。。。这是一个很纠结的事儿。[/quote]

程序中并没有对数组中相同位置进行写操作啊。。[/quote]没说相同的位置,所以才是“伪”共享。。。

10 楼

cgl_lgs兄应该是指各个cpu核心从内存读取(写入)的数据段太接近以至于受影响吧?
如果是这个,我印象中,书本说cpu会采用机制强行要求数据同步的吧.

我来回复

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