24小时热门版块排行榜    

查看: 2529  |  回复: 8
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

mhyuan

金虫 (小有名气)

[求助] 关于MPI并行编程的基本问题

想要自学MPI并行编程,由于以前从未接触过MPI,有熟悉的希望能帮个忙,多谢。

我现在的想要的是,给我举一个MPI的实际例子,下面是我写的一个简单的Fortran程序,是关于计算两个数组相乘的。程序不是很复杂,希望熟悉MPI的兄弟姐妹帮我改编成MPI并行程序,并详细说明一下如何运行(由于初学MPI,对这方面的知识还处于空白状态),希望有人帮忙,不胜感激!

  Program Matrix
  Implicit None
  Integer :: I,J,K
  Integer :: A(4,4),B(4,4),C(4,4)
  Data A/1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7/
  Data B/9,8,7,6,5,4,3,2,1,9,8,7,6,5,4,3/
  Do I=1,4
    Do J=1,4
      C(I,J)=0
      Do k=1,4
        C(I,J)=C(I,J)+A(I,K)*B(K,J)
      Enddo
    Enddo
  Write(1101,*) (C(I,J),J=1,4)
  Enddo
  End

[ Last edited by mhyuan on 2011-7-11 at 21:40 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mhyuan

金虫 (小有名气)

刚入门,写了一个最简单的并行程序(Matrix.f90)。如下:
        Program Matrix
        Implicit None
        Include 'mpif.h'
       
        Integer :: I,J,K
        Integer :: iam,np,ierr
        integer :: status(MPI_STATUS_SIZE)
        Integer :: A(4,4),B(4,4),C(4,4)

        Call MPI_INIT(Ierr)
        Call MPI_COMM_RANK(mpi_comm_world,iam,ierr)
        Call mpi_comm_size(mpi_comm_world,np,ierr)
       
          Data A/1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7/
          Data B/9,8,7,6,5,4,3,2,1,9,8,7,6,5,4,3/
          Data C/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/

        Do J=1,4
          Do I=1,4
            C((iam+1),J)=C((iam+1),J)+A((iam+1),I)*B(I,J)
          Enddo
        Enddo

        If (iam==0) then
          Call MPI_Recv(c(2,1),1,MPI_Integer,1,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(2,2),1,MPI_Integer,1,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(2,3),1,MPI_Integer,1,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(2,4),1,MPI_Integer,1,0,mpi_comm_world,status,ierr)

          Call MPI_Recv(c(3,1),1,MPI_Integer,2,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(3,2),1,MPI_Integer,2,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(3,3),1,MPI_Integer,2,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(3,4),1,MPI_Integer,2,0,mpi_comm_world,status,ierr)

          Call MPI_Recv(c(4,1),1,MPI_Integer,3,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(4,2),1,MPI_Integer,3,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(4,3),1,MPI_Integer,3,0,mpi_comm_world,status,ierr)
          Call MPI_Recv(c(4,4),1,MPI_Integer,3,0,mpi_comm_world,status,ierr)
        Elseif (iam==1) then
            Call MPI_send(c(2,1),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(2,2),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(2,3),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(2,4),1,MPI_Integer,0,0,mpi_comm_world,ierr)
        Elseif (iam==2) then
            Call MPI_send(c(3,1),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(3,2),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(3,3),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(3,4),1,MPI_Integer,0,0,mpi_comm_world,ierr)
        Elseif (iam==3) then
            Call MPI_send(c(4,1),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(4,2),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(4,3),1,MPI_Integer,0,0,mpi_comm_world,ierr)
            Call MPI_send(c(4,4),1,MPI_Integer,0,0,mpi_comm_world,ierr)
        Endif

        If (iam==0) then
          Do I=1,4
            Write(1102,*) (C(I,J),J=1,4)
          Enddo
        Endif

        Call MPI_FINALIZE(ierr)
        End
运行方式为:
    mpif90 Matrix.f90 -o Matrix
       mpirun -np 4 ./Matrix
(当然在并行机环境下)
运行结果(fort.1102):
     136          60         146          79
         103          47          99          61
         133          61         124          79
         163          75         149          97
(与上面的串行程序结果(fort.1101)完全一样)
(这个并行程序很低级,有待继续改进......)
4楼2011-07-21 09:01:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 9 个回答

tsiangsun

木虫 (小有名气)

【答案】应助回帖


xzhdty(金币+1): 欢迎常来程序语言版讨论 2011-07-13 01:07:47
mhyuan(金币+5): 2011-07-16 09:23:21
mpi是cpu之间传递信息(数据)的协议。你要明确指定每个cpu要做什么计算,不是说把这个程序编程mpi就行了的。

网上和书店就有卖教材的,看了以后再来问
2楼2011-07-12 23:48:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mhyuan

金虫 (小有名气)


jjdg(金币+1): 感谢参与程序语言版讨论 2011-07-16 13:31:29
引用回帖:
Originally posted by tsiangsun at 2011-07-12 23:48:18:
mpi是cpu之间传递信息(数据)的协议。你要明确指定每个cpu要做什么计算,不是说把这个程序编程mpi就行了的。

网上和书店就有卖教材的,看了以后再来问

正在学习过程中......呵呵。
3楼2011-07-16 09:25:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mhyuan

金虫 (小有名气)


dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-31 13:22:45
简单版本
        Program Matrix
        Implicit None
        Include 'mpif.h'
       
        Integer :: I,J,K
        Integer :: iam,np,ierr
        Integer :: A(4,4),B(4,4),C(4,4)
        Integer :: AA(4),CC(16)

        Call MPI_INIT(Ierr)
        Call MPI_COMM_RANK(mpi_comm_world,iam,ierr)
        Call mpi_comm_size(mpi_comm_world,np,ierr)
       
          Data A/1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7/
          Data B/9,8,7,6,5,4,3,2,1,9,8,7,6,5,4,3/
          Data CC/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/

        Do I=1,4
          AA(I)=A((iam+1),I)
        Enddo

        Do J=1,4
          Do I=1,4
            CC(J)=CC(J)+AA(I)*B(I,J)
          Enddo
        Enddo

        Call MPI_Gather(CC,4,MPI_Integer,CC,4,MPI_Integer,0,mpi_comm_world,ierr)

        If (iam==0) then
        K=0
        Do I=1,4
          Do J=1,4
            K=K+1
                C(I,J)=CC(K)
          Enddo
          Write(1103,*) (C(I,J),J=1,4)
        Enddo
        Endif

        Call MPI_FINALIZE(ierr)
        End
运行方式一样
运行结果一样
5楼2011-07-22 11:21:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 化学工程321分求调剂 +14 大米饭! 2026-03-15 17/850 2026-03-18 12:40 by Linda Hu
[考研] 一志愿天津大学化学工艺专业(081702)315分求调剂 +9 yangfz 2026-03-17 9/450 2026-03-18 12:38 by 尽舜尧1
[考研] 0703化学调剂 +4 pupcoco 2026-03-17 7/350 2026-03-18 12:14 by djl2006
[考研] 268求调剂 +6 简单点0 2026-03-17 6/300 2026-03-18 09:04 by 无际的草原
[考研] 085601专硕,总分342求调剂,地区不限 +4 share_joy 2026-03-16 4/200 2026-03-17 21:32 by hmn_wj
[考研] 材料与化工求调剂 +6 为学666 2026-03-16 6/300 2026-03-17 20:15 by peike
[考研] 277调剂 +5 自由煎饼果子 2026-03-16 6/300 2026-03-17 19:26 by 李leezz
[考研] 26考研求调剂 +6 丶宏Sir 2026-03-13 6/300 2026-03-17 16:13 by 醉在风里
[考博] 26申博 +4 八旬速览 2026-03-16 4/200 2026-03-17 13:00 by 轻松不少随
[考研] 一志愿南京大学,080500材料科学与工程,调剂 +4 Jy? 2026-03-16 4/200 2026-03-17 11:02 by gaoqiong
[考研] 304求调剂 +4 ahbd 2026-03-14 4/200 2026-03-16 16:48 by 我的船我的海
[考研] 0703化学调剂 290分有科研经历,论文在投 +7 腻腻gk 2026-03-14 7/350 2026-03-16 10:12 by houyaoxu
[考研] 求老师收留调剂 +4 jiang姜66 2026-03-14 5/250 2026-03-15 20:11 by Winj1e
[考研] 288求调剂 +4 奇点0314 2026-03-14 4/200 2026-03-14 23:04 by JourneyLucky
[考研] 材料工程327求调剂 +3 xiaohe12w 2026-03-11 3/150 2026-03-14 20:20 by ms629
[考研] 本科南京大学一志愿川大药学327 +3 麦田耕者 2026-03-14 3/150 2026-03-14 20:04 by 外星文明
[考研] 工科278分求调剂 +5 周慢热啊 2026-03-12 7/350 2026-03-13 15:49 by JourneyLucky
[考研] 求调剂 +3 程雨杭 2026-03-12 3/150 2026-03-13 15:06 by JourneyLucky
[考研] 070303一志愿西北大学学硕310找调剂 +3 d如愿上岸 2026-03-13 3/150 2026-03-13 10:43 by houyaoxu
[考研] 化工学硕306求调剂 +9 42838695 2026-03-12 9/450 2026-03-13 10:16 by houyaoxu
信息提示
请填处理意见