主题:Fortran + OpenMP 的问题,串并行结果不同。
xaml
[专家分:0] 发布于 2011-12-24 22:18:00
以下这段代码,串行和使用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个回复)
沙发
yeg001 [专家分:14390] 发布于 2011-12-24 22:48:00
!$OMP PARALLEL PRIVATE(temp,K,I,J)
试试看?
板凳
xaml [专家分:0] 发布于 2011-12-24 22:54:00
循环迭代变量应该不能出现在pirvate列表里面吧,我看过一本书是这样说的。一会我试试你说的,谢谢啊。
3 楼
yeg001 [专家分:14390] 发布于 2011-12-25 09:50:00
K,I,J 不是迭代的共享变量, 他们只是指标. 如果指标共享,那线程就对同一个指标进行计算, 你觉得对不对?
况且进入循环的时候指标是会进行赋值的,这时候若指标共用就会数据冲突.
4 楼
xaml [专家分:0] 发布于 2011-12-25 14:03:00
[quote]K,I,J 不是迭代的共享变量, 他们只是指标. 如果指标共享,那线程就对同一个指标进行计算, 你觉得对不对?
况且进入循环的时候指标是会进行赋值的,这时候若指标共用就会数据冲突.[/quote]
按照这个!$OMP PARALLEL PRIVATE(temp,K,I,J)试验了一下,结果还是错误的,不知道是哪里出了问题啊。
5 楼
yeg001 [专家分:14390] 发布于 2011-12-25 23:55:00
你这个代码里面没有函数吧? 如果没我看不出哪里出问题了. 慢慢调试一下吧.
6 楼
xaml [专家分:0] 发布于 2011-12-26 10:57:00
[quote]你这个代码里面没有函数吧? 如果没我看不出哪里出问题了. 慢慢调试一下吧.[/quote]
没有函数的。我再调试一下吧。
7 楼
cgl_lgs [专家分:21040] 发布于 2011-12-26 12:34:00
楼主上网找:
伪共享
吧。。。这是一个很纠结的事儿。
8 楼
xaml [专家分:0] 发布于 2011-12-26 12:47:00
[quote]楼主上网找:
伪共享
吧。。。这是一个很纠结的事儿。[/quote]
程序中并没有对数组中相同位置进行写操作啊。。
9 楼
cgl_lgs [专家分:21040] 发布于 2011-12-26 14:08:00
[quote][quote]楼主上网找:
伪共享
吧。。。这是一个很纠结的事儿。[/quote]
程序中并没有对数组中相同位置进行写操作啊。。[/quote]没说相同的位置,所以才是“伪”共享。。。
10 楼
yeg001 [专家分:14390] 发布于 2011-12-26 18:48:00
cgl_lgs兄应该是指各个cpu核心从内存读取(写入)的数据段太接近以至于受影响吧?
如果是这个,我印象中,书本说cpu会采用机制强行要求数据同步的吧.
我来回复