Fortran Coder

标题: 关于Fortran2008的Coarray [打印本页]

作者: jason388    时间: 2014-3-1 09:46
标题: 关于Fortran2008的Coarray
Fortran2008标准虽然是一个小改版,但其引进了Coarray,使Fortran真正进化为了一个并行编程语言,据说在语言标准中引进并行这还是第一次。

Coarray使得并行编程非常容易实现,实际上标准为此仅仅增加了十几条语句(含结构),相比openmp和mpi等更容易学习。

Coarray基于PGAS(Partitioned Global Address Space),可适用于distributed memory machines、shared memory machines 以及 clustered machines的并行编程。

目前G95的linux版本已经实现了Coarray,感兴趣者可以下载适用。而且G95开发者Andrew Vaught的文章“The complete compendium on coorperative computing using coarrays”也是学习coarray的非常好的参考。该文章在G95的网站上有连接下载(compendium)。


作者: aliouying    时间: 2014-3-1 10:00
这个非常有意思,楼主是否测试过,是否给MPI或者openmp等对比过计算的效率?
作者: jason388    时间: 2014-3-1 10:05
aliouying 发表于 2014-3-1 10:00
这个非常有意思,楼主是否测试过,是否给MPI或者openmp等对比过计算的效率? ...

没有测试过。我个人以前用过openmp,未用过mpi。

openmp等虽然都不错,但毕竟不是Fortran语言直接支持的,因此编程时还是不很方便
作者: jason388    时间: 2014-3-1 10:07
这是Andrew Vaught文章中详细讲解的例子,感兴趣的可以试试。
[Fortran] 纯文本查看 复制代码
module pi_calc
  use, intrinsic :: iso_c_binding
  implicit none
  type results
    integer(kind=8) :: in,total
  end type results

  type(results) :: acc

  •   logical :: flag


  •   interface
        subroutine usleep(u) bind(c)
          use, intrinsic :: iso_c_binding
          integer(kind=c_long),value :: u
        end subroutine usleep
      end interface

    contains
      subroutine master
        implicit none
        integer :: n
        type(results) :: sum
        do
          call usleep(1000000_c_long)
          do n=2,num_images()
            flag[n]=.true.
          end do
          sync images(*)
          sum%total=0
          sum%in=0
          do n=2,num_images()
            sum%total=sum%total+acc[n]%total
            sum%in=sum%in+acc[n]%in
          end do
          print*,sum%in,sum%total,4*dble(sum%in)/dble(sum%total)
        end do
      end subroutine master
      subroutine worker
        implicit none
        real :: x,y
        type(results) :: local
        local%in=0
        local%total=0
        do
          call random_number(x)
          call random_number(y)
          if(x*x+y*y<1.0)local%in=local%in+1
          local%total=local%total+1
          if(flag)then
            acc=local
            flag=.false.
            sync images(1)
          end if
        end do
      end subroutine worker
    end module pi_calc

    program m
      use pi_calc
      if(num_images()==1)stop "Need more images!"
      if(this_image()==1)then
        call master()
      else
        call worker()
      end if
    end program m

  • 作者: fcode    时间: 2014-3-1 11:24
    Intel 的 win 和 linux 编译器也支持了 Coarray ,我不确定,可能是部分特征。

    但是要实现,还依赖Intel MPI Library。
    作者: aliouying    时间: 2014-3-1 11:51
    fcode 发表于 2014-3-1 11:24
    Intel 的 win 和 linux 编译器也支持了 Coarray ,我不确定,可能是部分特征。

    但是要实现,还依赖Intel M ...

    intel MPI 库需要单独装吧?
    作者: fcode    时间: 2014-3-1 12:10
    aliouying 发表于 2014-3-1 11:51
    intel MPI 库需要单独装吧?

    嗯,要单独装,可以申请30天试用
    作者: jason388    时间: 2014-3-1 15:26
    fcode 发表于 2014-3-1 12:10
    嗯,要单独装,可以申请30天试用

    gfortran和g95虽然性能上与intel的有些差距,但也没那么多限制,对于学习来说够用了。
    作者: jason388    时间: 2016-2-21 09:11
    coarray在gfortran5已经可以用了。因为需要调用opencoarray库,所以先要编译好libcaf_mpi.a.

    opencoarrays是在linux下开发的所以在windows下编译需要cygwin,且因其依赖mpi,还要先编译好mpi环境。我在64位cygwin下采用gfortran5.3编译openmpi 1.10.2一次通过,然后按readme直接编译opencoarrays源码(因cygwin的cmake版本低无法用)生成libcaf_mpi.a。

    试了上面的例子没有问题,但效率如何没有比较。
    作者: 鹰击长空    时间: 2019-5-12 12:10
    fcode 发表于 2014-3-1 12:10
    嗯,要单独装,可以申请30天试用

    新版的编译器已经自带Intel MPI libary了吧?




    欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2