forall与do循环的区别.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
forall与do循环的区别

FORTRAN中FORALL与DO的区别 FORTRAN中FORALL与DO的区别: 以下是个人对FORALL与DO的区别的理解,完全基于一些程序【仅列出下面一个程序】和参考国内与国外教材而得出的。如果有不对的地方,请联系我。谢谢! INTEGER :: nn(0:8)=(/0,1,2,3,4,5,6,7,8/), mm(0:7) FORALL(i=0:7) nn(i) = 0 mm(i) = nn(i+1) END FORALL ! 等价于 nn(0:7) = 0 !??????? mm(0:7) = nn(1:8) write(*,(a,10i2)) nn= : ,nn write(*,(a,10i2)) mm= : ,mm nn(0:8)=(/0,1,2,3,4,5,6,7,8/) DO i=0,7 nn(i) = 0 mm(i) = nn(i+1) END DO write(*,*) write(*,(a,10i2)) nn= : ,nn write(*,(a,10i2)) mm= : ,mm END 程序运行结果: nn= : 0 0 0 0 0 0 0 0 8 mm= : 0 0 0 0 0 0 0 8 nn= : 0 0 0 0 0 0 0 0 8 mm= : 1 2 3 4 5 6 7 8 Press any key to continue 先对DO理解: DO i=0,7 nn(i) = 0 mm(i) = nn(i+1) END DO 当i为0时,nn(0)=0,并返还到nn,此时数组是nn(0:8)=(/0,1,2,3,4,5,6,7,8/)【nn(0:7)没有完全改变】 mm(0)=nn(1),所以mm(0)值为1 当i为1时,nn(1)=0,并返还到nn,此时数组是nn(0:8)=(/0,0,2,3,4,5,6,7,8/)【nn(0:7)没有完全改变】 mm(1)=nn(2),所以mm(1)值为2 以此类推...... 当i为6时,nn(6)=0,并返还到nn,此时数组是nn(0:8)=(/0,0,0,0,0,0,0,7,8/)【nn(0:7)没有完全改变】 mm(6)=nn(7),所以mm(7)值为7 当i为7时,nn(7)=0,并返还到nn,此时数组是nn(0:8)=(/0,0,0,0,0,0,0,0,8/)【nn(0:7)完全改变】 mm(7)=nn(8),所以mm(7)值为8 最后得出结果是: nn= : 0 0 0 0 0 0 0 0 8 mm= : 1 2 3 4 5 6 7 8 也就是说是用DO的时候,处理器是按次序来操作每一个连续的迭代,一个接着一个。在一个完成之后才执行下一个。就如同我上面的解释一样,先是0,然后是 1,之后是2....最后是7。只有在i=7结束时,nn(0:7)才完全改变。【具体是不是这样的呢?你可以在nn(i)=0后面添加这2个语句来试一 试 write(*,*)nn(,i,)=,nn(i) write(*,*)nn(,i+1,)=,nn(i+1)】 再来看FORALL结构 FORALL(i=0:7) nn(i) = 0 mm(i) = nn(i+1) END FORALL 输出结果是: nn= : 0 0 0 0 0 0 0 0 8 mm= : 0 0 0 0 0 0 0 8 很显然是mm(i)中使用的nn(i+1)是已经变化过的nn。 程序开始,对于i=0,7并不是一个一个按次序来的,而是同时进行的,即:没有先后次序。系统识别到nn(i)=0,于是就同时将nn(0)、 nn(1)、nn(2)、nn(3)、nn(4)、nn(5)、nn(6)、nn(7)赋值为0,然后将他们返回给nn,现在数组nn就变成了 nn(0:8)=(/0,0,0,0,0,0,0,0,8/)。【就在这一步nn(0:7)完全改变了,而不像DO要用7步才完成。】 到此nn(i)=0这一个执行语句已经结束了。 接下来是mm(i) = nn(i+1)。同样,系统同时将nn(1)赋给mm(0)、nn(2)赋给mm(1)、nn(3)赋给mm(2)、......nn(8)赋给 mm(7)。【就在这一步mm(0:7)完全改变了,而不像DO要用7步才完成。】于是数组mm就变成了nn(0:7)= (/0,0,0,0,0,0,0,8/)。 到此mm(i) = nn(i+1)这一个执行语句已经结束了。 所以这里给出一个结论是 FORALL是同时处理数据,而DO是逐个处理数据的。 【只要系统支持并行的赋值,FORALL语句以及结构,就能够自然地实现对一个庞大的数组的所有元素进行同时赋值,从而充分地利用了系统的并行效能。这个新特征的引入充分显示了FORTRAN在并行运算方面的努力。】 另外给出一个例子:

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档