爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4248|回复: 3

[经验总结] fortran+mpi学习笔记

[复制链接]

新浪微博达人勋

发表于 2017-1-23 17:28:29 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 兰大12级某渣渣 于 2017-1-23 17:31 编辑

2017.1.23最近在做并行算法大作业,学要用到fortran+mpi进行并行编程。在使用mpi_gather即收集操作时,一直存在疑问:收集到root进程上的数组顺序到底是什么样的。
在网上搜了好久也没找打(估计是这问题太easy了吧= =)研究了好久,终于搞明白了,想想也没有写博客的习惯,就把记录发到这里吧。
附探究代码如下
program p12
integer ierror,comm,myrank
real     a(2,8),b(64),c(8,8),d(8,8),tmp
include 'mpif.h'
call mpi_init(ierror)
call mpi_comm_dup(mpi_comm_world,comm,ierror)
call mpi_comm_rank(comm,myrank,ierror)
if (myrank==0) then
    a(1,1)=0.001
    a(1,2)=0.002
    a(1,3)=0.003
    a(1,4)=0.004
    a(1,5)=0.005
    a(1,6)=0.006
    a(1,7)=0.007
    a(1,8)=0.008
    a(2,1)=0.009
    a(2,2)=0.010
    a(2,3)=0.011
    a(2,4)=0.012
    a(2,5)=0.013
    a(2,6)=0.014
    a(2,7)=0.015
    a(2,8)=0.016
elseif (myrank==1) then
    a(1,1)=0.101
    a(1,2)=0.102
    a(1,3)=0.103
    a(1,4)=0.104
    a(1,5)=0.105
    a(1,6)=0.106
    a(1,7)=0.107
    a(1,8)=0.108
    a(2,1)=0.109
    a(2,2)=0.110
    a(2,3)=0.111
    a(2,4)=0.112
    a(2,5)=0.113
    a(2,6)=0.114
    a(2,7)=0.115
    a(2,8)=0.116
elseif (myrank==2) then
    a(1,1)=0.201
    a(1,2)=0.202
    a(1,3)=0.203
    a(1,4)=0.204
    a(1,5)=0.205
    a(1,6)=0.206
    a(1,7)=0.207
    a(1,8)=0.208
    a(2,1)=0.209
    a(2,2)=0.210
    a(2,3)=0.211
    a(2,4)=0.212
    a(2,5)=0.213
    a(2,6)=0.214
    a(2,7)=0.215
    a(2,8)=0.216
    !a=transpose(a)
elseif (myrank==3) then
    a(1,1)=0.301
    a(1,2)=0.302
    a(1,3)=0.303
    a(1,4)=0.304
    a(1,5)=0.305
    a(1,6)=0.306
    a(1,7)=0.307
    a(1,8)=0.308
    a(2,1)=0.309
    a(2,2)=0.310
    a(2,3)=0.311
    a(2,4)=0.312
    a(2,5)=0.313
    a(2,6)=0.314
    a(2,7)=0.315
    a(2,8)=0.316
endif
call mpi_gather(transpose(a),2*8,mpi_integer,b,2*8,mpi_integer,0,comm,ierror)
if (myrank==0) then
   c=reshape(b,(/8,8/))
   d=transpose(c)
   do i=1,8
     do j=1,8
    write(*,100) c(i,j)
    100 format(1x,f7.3,$)
     enddo
    write(*,*)
   enddo
   write(*,*)
   do i=1,8
        do j=1,8
            write(*,100) d(i,j)
                     enddo
                         write(*,*)
                            enddo
endif
call mpi_finalize(ierror)
end

发现,在收集时做一次子数组的转置,再将收集得到的总数组做一个转置就得到了原来分数组按照顺序组合的形式了



mpi_gather.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-1-24 10:55:36 | 显示全部楼层
马克留用~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-7 09:02:18 | 显示全部楼层
{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-3-9 11:04:02 | 显示全部楼层
谢谢lz,学到了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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