- 积分
- 212
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-9-28
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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
发现,在收集时做一次子数组的转置,再将收集得到的总数组做一个转置就得到了原来分数组按照顺序组合的形式了
|
-
|