代码之家  ›  专栏  ›  技术社区  ›  DaveP

Fortran 95的WHERE、FORALL和SPREAD等结构通常会导致更快的并行代码吗?

  •  14
  • DaveP  · 技术社区  · 15 年前

    我已经读完了梅特卡夫、里德和科恩的Fortran 95书,以及Fortran 90中的数字食谱。他们建议使用WHERE、FORALL和SPREAD等方法来避免不必要的程序序列化。

    然而,我偶然发现 this answer 它声称FORALL在理论上是好的,但在实践中是没有意义的-你可以写循环,因为它们也可以并行,你可以显式地并行它们使用OpenMP(或一些编译器的自动功能,如Intel)。

    有没有人能从经验上验证他们是否发现这些构造在并行性能方面比显式循环和if语句提供了任何优势?

    语言还有其他类似的特点吗?这些特点在原则上是好的,但在实践中是不值得的?

    我很感激这些问题的答案有些依赖于实现,所以我对gfortran、Intel cpu和SMP并行性最感兴趣。

    5 回复  |  直到 9 年前
        1
  •  13
  •   M. S. B.    15 年前

    正如我在回答另一个问题时所说的那样,人们普遍认为福拉尔在被介绍到语言中时并没有像人们所希望的那样有用。正如在其他答案中已经解释过的,它有限制性的要求和有限的作用,编译器已经非常擅长于优化常规循环。编译器的性能不断提高,不同的编译器的性能也不尽相同。另一个线索是Fortran 2008正在重新尝试。。。除了在语言中添加显式并行化(前面已经提到了co数组),还有一个“do concurrent”,这是一种新的循环形式,它需要一些限制,这些限制应该更好地允许编译器执行自动并行化优化,但是应该足够通用,以便有用——请参见 ftp://ftp.nag.co.uk/sc22wg5/N1701-N1750/N1729.pdf .

        2
  •  6
  •   High Performance Mark    12 年前

    我对此做了一些浅显的研究,遗憾的是,通常发现显式地编写循环会比编写并行结构更快地生成程序。即使是简单的整个数组赋值,比如 A = 0 一般都比do循环性能好。

    我仍然使用并行结构,特别是整个数组操作,当它们是最自然的方式来表达我试图实现的目标时。我从未在OpenMP工作共享构造中测试过这些构造。我真的应该。

        3
  •  3
  •   David    14 年前

    FORALL是一个通用的屏蔽赋值语句(如WHERE)。它不是循环构造。

    OpenMP和MPI在较粗粒度级别上更有用。

        4
  •  0
  •   steabert    15 年前

    理论上,使用这样的赋值可以让编译器知道您想要做什么,并且应该允许它更好地优化它。在实践中,看马克的答案。。。我还认为,如果代码看起来更干净的话,这是很有用的。我用过诸如 FORALL 我自己也有几次,但没有注意到比平时有什么变化 DO 循环。

        5
  •  0
  •   Rook    15 年前

    *这应该是一个评论,而不是一个答案,但它不适合那个小盒子,所以我把它放在这里。别跟我作对:-)不管怎样,继续听@steabert对他的回答的评论。OpenMP和MPI是两个不同的东西;很少有人能在两者之间做出选择,因为它更多地取决于您的体系结构而不是个人选择。就学习并行性的概念而言,我建议您随时使用OpenMP;它比较简单,而且以后可以很容易地继续转换到MPI。

    但是,那不是我想说的。这是-几天后,英特尔宣布它已经开始支持 共阵列 ,以前仅由g95支持的F2008功能。他们并不打算放弃g95,但事实上英特尔编译器在生产代码中的应用更为广泛,所以这绝对是一个有趣的developemnt产品线。他们还更改了Visual Fortran编译器中的一些内容(首先是名称:-)

    链接后的更多信息: http://software.intel.com/en-us/articles/intel-compilers/

    推荐文章