• 全部
...

openmp并行Fortran后每次结果不一致

? Vita 2020-04-08 10:18:39
进行并行化之后每次结果不一致,对赋值代码进行了atomic保护也不好使。有没有大佬帮忙看看怎么回事。
代码很长。也不知道有没有大佬有耐心看完....
  1. implicit none
  2. integer n,m,node,node1,node2,ni,mj,p,q,k
  3. integer i,j

  4. real(4) rcm(3),rcn(3),dist
  5. real r1f(3),r2f(3),r3f(3),nSm(3),rjf(3,SNum_samp),r1s(3),r2s(3),r3s(3),ris(3,SNum_samp)
  6. real Am,An,lj,li,rmj(3),rni(3),rtmpv(3)
  7. real Jrm(3,maxRWG),Irn(3,maxRWG),Jlengthm(maxRWG),Ilengthn(maxRWG)

  8. complex coef1,coef2
  9. complex Amn_E,Zji,I1ss,I2ss(3),I3ss(3),I4ss
  10. complex ctmp,ctmp1

  11. real,external:: re_Norm
  12. integer*4 time1,time2,time

  13. call SYSTEM_CLOCK(time1)
  14. write(*,*) "Start to compute the SS part of the impedance matrix, on the way..."

  15. allocate(SparseValue(Num_side,Num_side))
  16. SparseValue=0

  17. coef1=cmplx(0.0,omega*MU0/(16.0*PI))
  18. coef2=cmplx(0.0,1.0/(4.0*PI*omega*EPS0))

  19. !$OMP parallel do default(none) shared(Num_Triangle,triangle_centroid,triangle_area,point_cor,triangle_point,triangle_rwgs,side_index,side_length,SparseValue,threshold_R,coef1,coef2) private(n,m,node,node1,node2,ni,mj,i,j,rcm,rcn,dist,r1f,r2f,r3f,rjf,r1s,r2s,r3s,ris,Am,An,lj,li,rmj,rni,Jrm,Irn,Jlengthm,Ilengthn,Amn_E,ctmp,I1ss,I2ss,I3ss,I4ss)
  20. do m=1,Num_Triangle
  21. rcm=triangle_centroid(:,m)
  22. Am=triangle_area(m)

  23. r1f=point_cor(:,triangle_point(1,m))
  24. r2f=point_cor(:,triangle_point(2,m))
  25. r3f=point_cor(:,triangle_point(3,m))

  26. do k=1,SNum_samp
  27. rjf(:,k)=epsilS(k)*r1f+etaS(k)*r2f+xiS(k)*r3f
  28. enddo

  29. do mj=1,triangle_rwgs(m)%N_rwg
  30. j=triangle_rwgs(m)%rwg(mj)

  31. if(side_index(3,j)==m) then
  32. !flagm=1.0
  33. Jlengthm(mj)=side_length(j)
  34. else !if(side_index(4,j)==m) then
  35. !flagm=-1.0
  36. Jlengthm(mj)=-side_length(j)
  37. endif

  38. node1=side_index(1,j); node2=side_index(2,j)
  39. do p=1,3
  40. node=triangle_point(p,m)
  41. if((node/=node1).and.(node/=node2)) exit
  42. enddo
  43. Jrm(:,mj)=point_cor(:,node)
  44. enddo

  45. do n=1,Num_Triangle
  46. rcn=triangle_centroid(:,n)
  47. An=triangle_area(n)

  48. r1s=point_cor(:,triangle_point(1,n)) !source triangle coordinates
  49. r2s=point_cor(:,triangle_point(2,n))
  50. r3s=point_cor(:,triangle_point(3,n))

  51. do k=1,SNum_samp
  52. ris(:,k)=epsilS(k)*r1s+etaS(k)*r2s+xiS(k)*r3s
  53. enddo

  54. dist=re_Norm(rcm-rcn)

  55. call Comp_eltsI(I1ss,I2ss,I3ss,I4ss,dist>=threshold_R,An,rjf,ris,r1s,r2s,r3s,SNum_samp,SNum_samp,weightS,weightS)

  56. do ni=1,triangle_rwgs(n)%N_rwg
  57. i=triangle_rwgs(n)%rwg(ni)
  58. if(side_index(3,i)==n) then
  59. !flagn=1.0
  60. Ilengthn(ni)=side_length(i)
  61. else !if(side_index(4,i)==n) then
  62. !flagn=-1.0
  63. Ilengthn(ni)=-side_length(i)
  64. endif

  65. node1=side_index(1,i); node2=side_index(2,i)
  66. do q=1,3
  67. node=triangle_point(q,n)
  68. if((node/=node1).and.(node/=node2)) exit
  69. enddo
  70. Irn(:,ni)=point_cor(:,node)
  71. enddo

  72. do mj=1,triangle_rwgs(m)%N_rwg
  73. j=triangle_rwgs(m)%rwg(mj)
  74. rmj=Jrm(:,mj)
  75. lj=Jlengthm(mj)

  76. ctmp=coef1*(I4ss-dot_product(rmj,I3ss))-coef2*I1ss

  77. do ni=1,triangle_rwgs(n)%N_rwg
  78. i=triangle_rwgs(n)%rwg(ni)

  79. rni=Irn(:,ni)
  80. li=Ilengthn(ni)

  81. Amn_E=lj*li*(coef1*(dot_product(rmj,rni)*I1ss-dot_product(rni,I2ss))+ctmp)

  82. !$OMP atomic
  83. SparseValue(i,j)=SparseValue(i,j)+Amn_E

  84. enddo
  85. enddo
  86. enddo

  87. enddo
  88. !$OMP end parallel do
...全文
给本帖投票
667 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
境� 2022-05-09
  • 打赏
  • 举报
回复
请问解决了吗,我也是这样的问题

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部