【问题标题】:Scattering matrix column by column in MPI using Fortran and contiguous datatype使用 Fortran 和连续数据类型在 MPI 中逐列散射矩阵
【发布时间】:2017-12-23 07:53:59
【问题描述】:

我正在尝试生成一个充满随机数的矩阵,其维度为(mysize)x(Np),其中Np 是一个给定的数字(例如,5)。 Mysize 来自进程数。然后每个处理器应该有自己的列,大小为1xNp

我的第一个想法是创建一个矢量数据类型,但后来我意识到这可以通过使用连续数据类型来完成。代码运行没有错误,但它只打印了一些应该存在的数字。我很确定问题出在指标上(type_columnMPI_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)

 I, process            0  received   0.247272870046176     
 0.386432141459887       8.816221414742263E-316  0.000000000000000E+000
 0.000000000000000E+000
 I, process            1  received   2.737792569698344E-008
 I, process            2  received   5.231628354959370E-002
 0.454932876242927       3.330771999738651E-315  0.000000000000000E+000
 0.000000000000000E+000
 3.352416881721526E+270  5.298272496856962E-315  0.000000000000000E+000
 0.000000000000000E+000

矩阵 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,其中 wqs MPI REAL 现在输出几乎很好,它出现如下: 0.172448542741186 0.365799359554864 0.873652885323619 0.431791120535807 0.736888940276372 所以它列。现在正在尝试修复它
  • 成功了。再次感谢@francescalus
  • 请不要将解决方案添加到问题中。您可以改为发布答案。
  • 完成。非常感谢
  • 为了更好的可读性,sendbuffer 可以是x_init(:,0) instead。另外,如果recvtype 是type_column,那么recvcount 应该是1 而不是Np

标签: parallel-processing fortran mpi


【解决方案1】:

按照上面的建议使用 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)

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 2020-03-30
    • 2017-04-28
    • 2011-06-09
    • 2021-04-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多