24小时热门版块排行榜    

查看: 2827  |  回复: 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的回帖

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

金虫 (小有名气)

刚入门,写了一个最简单的并行程序(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的回帖

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的回帖

kevin123581

金虫 (正式写手)

感觉mpi改写好复杂啊,我也准备学学
6楼2012-09-11 11:55:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lrlrwu

金虫 (小有名气)

呵呵,我也刚开始学习MPI编程~我用的是C环境下的~
7楼2012-09-11 18:06:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangjiang381

铜虫 (初入文坛)

不错!我也要学习
8楼2012-11-08 21:00:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

weiwei43

至尊木虫 (正式写手)

楼主学习得真快呀!
在 VS2008下可以吗?你写出的运行方式能转到vs2008下吗?
9楼2014-07-12 21:37:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 mhyuan 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +8 Ldrop2023 2026-08-13 8/400 2026-08-16 11:28 by jiege890620
[基金申请] 我的国基提前知道中了,可是同事的操作让我实在接受不了,怎么会有这样的人 +11 家与远方 2026-08-10 16/800 2026-08-16 10:28 by ray43
[基金申请] 有时候,自然基金真的不能太认真 (我的申报经验) +10 majunge000 2026-08-11 12/600 2026-08-16 08:18 by xli1984
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] filecode=后面第一个是大写字母 +6 wangze12014 2026-08-14 7/350 2026-08-15 20:12 by gltch
[基金申请] 小木虫上这么多卖论文的,真有人买论文么?感觉没必要啊 +12 Tide man 2026-08-10 13/650 2026-08-15 16:34 by 氺木
[基金申请] 奇怪,两个人的filecode固定段从头到尾一模一样 +8 布布和一二 2026-08-10 11/550 2026-08-14 14:58 by Equinoxhua
[基金申请] 应该是93bebmhtak前后十一个字符比较关键 +23 Lanmanbaby 2026-08-09 37/1850 2026-08-14 13:40 by Equinoxhua
[硕博家园] 请教兼职经验 +3 是阿文鸭 2026-08-09 3/150 2026-08-14 12:07 by HER12025
[基金申请] filecode +15 documentary 2026-08-10 17/850 2026-08-14 10:08 by kissu88
[基金申请] FileCode能看出啥? +10 要乐观耀哥 2026-08-10 32/1600 2026-08-14 09:37 by 要乐观耀哥
[基金申请] 静等基金结果 +8 gjjjzhong 2026-08-10 21/1050 2026-08-13 17:56 by 且听虎啸
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 分享一下我之前已中青C的计划书的filecode +4 布布和一二 2026-08-11 5/250 2026-08-13 12:56 by cratir
[基金申请] 综述论文作为代表作会不会影响评审专家的印象分? +11 yufeiwaner 2026-08-09 13/650 2026-08-12 08:17 by yufeiwaner
[基金申请] 帮忙看看fileCode +7 wwncly 2026-08-10 13/650 2026-08-11 19:36 by 冰心玉壶晴
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
[基金申请] 国自然结果 +4 Vierhys 2026-08-10 8/400 2026-08-10 15:06 by Vierhys
信息提示
请填处理意见