Fortran Coder

查看: 12810|回复: 9
打印 上一主题 下一主题

[并行] 关于Fortran2008的Coarray

[复制链接]

69

帖子

7

主题

0

精华

专家

F 币
320 元
贡献
224 点
跳转到指定楼层
楼主
发表于 2014-3-1 09:46:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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)。

分享到:  微信微信
收藏收藏2 点赞点赞 点踩点踩

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

沙发
发表于 2014-3-1 10:00:09 | 只看该作者
这个非常有意思,楼主是否测试过,是否给MPI或者openmp等对比过计算的效率?

69

帖子

7

主题

0

精华

专家

F 币
320 元
贡献
224 点
板凳
 楼主| 发表于 2014-3-1 10:05:45 | 只看该作者
aliouying 发表于 2014-3-1 10:00
这个非常有意思,楼主是否测试过,是否给MPI或者openmp等对比过计算的效率? ...

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

openmp等虽然都不错,但毕竟不是Fortran语言直接支持的,因此编程时还是不很方便

69

帖子

7

主题

0

精华

专家

F 币
320 元
贡献
224 点
地板
 楼主| 发表于 2014-3-1 10:07:57 | 只看该作者
这是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

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

5#
发表于 2014-3-1 11:24:25 | 只看该作者
Intel 的 win 和 linux 编译器也支持了 Coarray ,我不确定,可能是部分特征。

但是要实现,还依赖Intel MPI Library。

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

6#
发表于 2014-3-1 11:51:01 | 只看该作者
fcode 发表于 2014-3-1 11:24
Intel 的 win 和 linux 编译器也支持了 Coarray ,我不确定,可能是部分特征。

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

intel MPI 库需要单独装吧?

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

7#
发表于 2014-3-1 12:10:53 | 只看该作者
aliouying 发表于 2014-3-1 11:51
intel MPI 库需要单独装吧?

嗯,要单独装,可以申请30天试用

69

帖子

7

主题

0

精华

专家

F 币
320 元
贡献
224 点
8#
 楼主| 发表于 2014-3-1 15:26:04 | 只看该作者
fcode 发表于 2014-3-1 12:10
嗯,要单独装,可以申请30天试用

gfortran和g95虽然性能上与intel的有些差距,但也没那么多限制,对于学习来说够用了。

69

帖子

7

主题

0

精华

专家

F 币
320 元
贡献
224 点
9#
 楼主| 发表于 2016-2-21 09:11: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。

试了上面的例子没有问题,但效率如何没有比较。

评分

参与人数 1F 币 +9 贡献 +9 收起 理由
fcode + 9 + 9 赞一个!

查看全部评分

6

帖子

3

主题

0

精华

入门

F 币
41 元
贡献
22 点
10#
发表于 2019-5-12 12:10:04 | 只看该作者
fcode 发表于 2014-3-1 12:10
嗯,要单独装,可以申请30天试用

新版的编译器已经自带Intel MPI libary了吧?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-19 22:45

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表