首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拖延转手

拖延转手
EN

Stack Overflow用户
提问于 2013-07-03 15:36:16
回答 1查看 147关注 0票数 2

在以下子程序(计算y方向通量)期间,我的2D水电代码暂停:

代码语言:javascript
运行
复制
 ALLOCATE(W1d(1:my,nFields),q1d(nFields),&
           Wl(1:my,nFields),Wr(1:my,nFields))

 PRINT *,"Main loop"
 DO i=1,mx
    DO j=1,my
       q1d(1) = qVar(i,j,1,iRho)
       q1d(2) = qVar(i,j,1,  iE)
       q1d(3) = qVar(i,j,1, ivy)
       q1d(4) = qVar(i,j,1, ivx)
       CALL Cons2Prim(q1d(:), W1d(j,:))
    ENDDO

    CALL lr_states(grid, W1d, dt, dy, Wl, Wr, dir)

    DO j=1,my
       Flux(i,j,:) = hllc_flux(wl(j,:), wr(j,:))
    ENDDO

    DO j=1,my
       CALL Prim2Cons(Wl(j,:),Ul(i,j,:))
       CALL Prim2Cons(Wr(j,:),Ur(i,j,:))
    ENDDO
 ENDDO
 PRINT *,"Deallocating"

 DEALLOCATE(W1d,q1d,Wl,Wr)
 PRINT *,"Returning"

我将DEALLOCATE语句分成4个单独的语句,发现无论哪一个2D数组最先出现,W1dwlwr都是导致失速的原因。忽略DEALLOCATE语句(在返回主服务器时应该会产生自动释放)也会导致延迟。X方向通量的子例程具有相同的数组,在此子例程之前调用,并且不存在处理它们的问题。

有什么建议吗?

编辑这是运行在Fedora 18和编译的英特尔Fortran 2013.3。这是一个并行化的代码,但是为了测试/调试目的,我在一个处理器上运行它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-03 20:01:08

我做了三件不同的事情,突然又开始起作用了。我认为其中两人不可能做到,而第三位则有可能做到了。我所做的改变:

  • 我确实定义了ij循环的边界略有不同,所以我使其在两个方向扫描之间保持一致。
  • 我运行了make cleanmake
  • 我向Makefile添加了-check bounds -check pointers -check uninit标志

我认为前两位并没有真正做任何事情。上面代码中的变量grid是一个包含qVar边界的2x2数组;在x扫描中,我定义了mx = grid(1,2) - grid(1,1) + 1,类似于my,但是网格( 1,1)1,所以它实际上并没有什么不同。上面的第二项我做了至少3次。

但最后一次我试了一次,它又开始起作用了。我不知道那怎么能修好它,所以如果有人知道,请告诉我!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17452243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档