回 帖 发 新 帖 刷新版面

主题: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个回复)

11 楼

[quote]cgl_lgs兄应该是指各个cpu核心从内存读取(写入)的数据段太接近以至于受影响吧?
如果是这个,我印象中,书本说cpu会采用机制强行要求数据同步的吧.[/quote]
不会,而且真的很不好处理,办法倒不是没有,如果数据够多,那楼主把内外循环调换一下或许就可以了。

12 楼

[quote][quote]cgl_lgs兄应该是指各个cpu核心从内存读取(写入)的数据段太接近以至于受影响吧?
如果是这个,我印象中,书本说cpu会采用机制强行要求数据同步的吧.[/quote]
不会,而且真的很不好处理,办法倒不是没有,如果数据够多,那楼主把内外循环调换一下或许就可以了。[/quote]

是不是把 I,J,K 这3个DO调换一下顺序可能会解决问题? 数据确实比较多, 维度都是几百的。  

能不能推荐一篇关于伪共享的文章?

13 楼

网上找找吧,我也没仔细记录过。

14 楼

[quote][quote]cgl_lgs兄应该是指各个cpu核心从内存读取(写入)的数据段太接近以至于受影响吧?
如果是这个,我印象中,书本说cpu会采用机制强行要求数据同步的吧.[/quote]
不会,而且真的很不好处理,办法倒不是没有,如果数据够多,那楼主把内外循环调换一下或许就可以了。[/quote]
内外循环调换以后,运行结果确实与调换之前有了一点不同,但是跟串行的相比,结果仍然是错误的。

15 楼

你查查看有没有越界访问的问题吧,我不是很确定。但现在能想到的就这个。

我来回复

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