Parallel processing 使用Fortran和连续数据类型在MPI中逐列散射矩阵
我试图生成一个充满随机数的矩阵,维数为Parallel processing 使用Fortran和连续数据类型在MPI中逐列散射矩阵,parallel-processing,fortran,mpi,Parallel Processing,Fortran,Mpi,我试图生成一个充满随机数的矩阵,维数为(mysize)x(Np),其中Np是一个给定的数字(比如,5)Mysize来自进程的数量。然后每个处理器都应该有自己的列,大小为1xNp 我的第一个想法是创建一个向量数据类型,但后来我意识到这可以通过使用连续数据类型来实现。代码运行时没有错误,但它只打印了应该存在的一些数字。我很确定问题在于指标(type_column,MPI_REAL,等等)以及它们实际上应该是什么,但我无法理解这一点。有人愿意帮忙吗 守则: program main use
(mysize)x(Np)
,其中Np
是一个给定的数字(比如,5)Mysize
来自进程的数量。然后每个处理器都应该有自己的列,大小为1xNp
我的第一个想法是创建一个向量数据类型,但后来我意识到这可以通过使用连续数据类型来实现。代码运行时没有错误,但它只打印了应该存在的一些数字。我很确定问题在于指标(type_column
,MPI_REAL
,等等)以及它们实际上应该是什么,但我无法理解这一点。有人愿意帮忙吗
守则:
program main
use mpi
integer :: ierr,myrank,mysize
integer :: Np=5, type_column
integer*8, external :: seedgen
real*8, dimension(:,:), allocatable :: x_init
real*8, dimension(:), allocatable :: block_x
character(4) :: rank
integer, dimension(1) :: new_seed
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,mysize,ierr)
allocate(block_x(0:Np-1))
if (myrank==0) then
allocate(x_init(0:Np-1,0:mysize-1))
new_seed = seedgen(myrank)
write(*,*) new_seed !This is to check if the seed changes each time
call random_seed(put=new_seed)
call random_number(x_init)
open(unit=1111, file='./x_tot.txt')
write(1111,*) x_init
close(1111) !Up to this point, everything works
end if
call MPI_TYPE_CONTIGUOUS(Np,MPI_REAL,type_column,ierr)
call MPI_TYPE_COMMIT(type_column,ierr)
call MPI_SCATTER(x_init(:,myrank),Np,MPI_REAL,block_x,Np,type_column,0,MPI_COMM_WORLD,ierr)
write(rank,'(I4)') myrank
write(*,*) 'I, process ',myrank,' received ', block_x(0:Np-1)
open(unit=myrank, file='./x_teste_'//trim(adjustl(rank))//'.txt')
write(myrank,*) block_x
close(myrank)
call MPI_TYPE_FREE(type_column,ierr)
call MPI_FINALIZE(ierr)
end program main
!!! You may ignore what is down below, just a function to generate random seeds.
function seedgen(myrank)
use iso_fortran_env
implicit none
integer(kind=int64) :: seedgen
integer, intent(IN) :: myrank
integer :: s
call system_clock(s)
seedgen = abs( mod((s*181)*((myrank-83)*359), 104729) )
end function seedgen
输出(使用3个处理器运行后,因此mysize=3)
矩阵x_tot:
0.247272870046176 0.386432141459887 0.473788032900533
0.239586263133600 0.851724848335892 5.231628354959370E-002
0.454932876242927 0.702720716936168 0.559915585253771
0.605745282251549 0.253298270763062 0.809867899324171
0.590174190311136 0.125210425650182 8.138975171285148E-002
因此,您可以看到,一些数字是好的,其余的是垃圾。按照上面的建议使用MPI_DOUBLE,并按照下面的方法更改书写效果很好。再次感谢
open(unit=myrank, file='./x_teste_'//trim(adjustl(rank))//'.txt')
do i=0,Np-1
write(myrank,*) block_x(i)
end do
close(myrank)
这是一个很好的观点。我已经将类型更改为MPI DOUBLE,其中它是wqs MPI REAL,现在通过输出几乎是好的,它是这样的:0.172448541186 0.365799359554864 0.873652885323619 0.431791120535807 0.736888940276372,所以它有3行和2列,但它应该只有1行和5列。现在想把它修好,它成功了。再次感谢@francescalusPlease不要在问题中添加解决方案。你可以发布一个答案。完成。感谢lot提供了更好的可读性,sendbuffer可以是
x_init(:,0)
。此外,如果recvtype是type\u列
,那么recvcount应该是1
,而不是Np
?
open(unit=myrank, file='./x_teste_'//trim(adjustl(rank))//'.txt')
do i=0,Np-1
write(myrank,*) block_x(i)
end do
close(myrank)