Fortran Coder

查看: 914|回复: 1
打印 上一主题 下一主题

[并行] MPI缓存发送消息如何修改正确

[复制链接]

5

帖子

3

主题

0

精华

入门

F 币
34 元
贡献
13 点
跳转到指定楼层
楼主
发表于 2024-3-23 20:05:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01program main
02    use mpi
03    implicit none
04 
05    integer::ierr,myid,nprocs
06    integer::msize=6, bsize
07    real(8)::buffer(6),b(6)
08    real(8),allocatable::tmbuff(:)
09    integer, parameter :: MAX_BUFFER_SIZE = 1024
10 
11    call MPI_init(ierr)
12    call MPI_comm_size(MPI_comm_world,nprocs,ierr)
13    call MPI_comm_rank(MPI_comm_world,myid,ierr)
14 
15    if(myid==0)then
16 
17        buffer(1:6)=(/1.0,2.0,3.0,4.0,5.0,6.0/)
18 
19        allocate(tmbuff(MAX_BUFFER_SIZE))
20        call MPI_Buffer_attach(tmbuff, size(tmbuff)*8, ierr)
21 
22        call MPI_bsend(buffer,msize-1,MPI_double_precision,1,2000,MPI_comm_world,ierr)
23        call MPI_bsend(buffer,1,      MPI_double_precision,1,2001,MPI_comm_world,ierr)
24         
25        call MPI_buffer_detach(tmbuff, size(tmbuff)*8, ierr)
26         
27    else if (myid==1) then
28        call MPI_recv(b,msize-1,MPI_double_precision,0,2000,MPI_comm_world,ierr)
29        print *,'b1 = ',b
30        call MPI_recv(b,1,      MPI_double_precision,0,2001,MPI_comm_world,ierr)
31        print *,'b2 = ',b
32    end if
33 
34 
35    call MPI_finalize(ierr)
36end program

请问这段代码的这一部分如何修改正确?
[Fortran] 纯文本查看 复制代码
1allocate(tmbuff(MAX_BUFFER_SIZE))
2call MPI_Buffer_attach(tmbuff, size(tmbuff)*8, ierr)
3 
4call MPI_bsend(buffer,msize-1,MPI_double_precision,1,2000,MPI_comm_world,ierr)
5call MPI_bsend(buffer,1, MPI_double_precision,1,2001,MPI_comm_world,ierr)

运行时候有错误
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

5

帖子

3

主题

0

精华

入门

F 币
34 元
贡献
13 点
沙发
 楼主| 发表于 2024-3-23 23:10:14 | 只看该作者
解决了
这是正确的代码
[Fortran] 纯文本查看 复制代码
01program main
02    use mpi
03    implicit none
04 
05    integer::ierr,myid,nprocs
06    integer::msize=6, bsize
07    real(8)::buffer(6),b(6)
08    real(8),allocatable::tmbuff(:)
09    integer, parameter :: MAX_BUFFER_SIZE = 1024
10    integer::status(MPI_status_size)
11 
12    call MPI_init(ierr)
13    call MPI_comm_size(MPI_comm_world,nprocs,ierr)
14    call MPI_comm_rank(MPI_comm_world,myid,ierr)
15 
16    if(myid==0)then
17 
18        buffer(1:6)=(/1.0,2.0,3.0,4.0,5.0,6.0/)
19        !call MPI_pack_size(msize,MPI_double_precision,MPI_comm_world,bsize,ierr)
20        print *,'MPI_bsend_overhead = ', MPI_bsend_overhead
21        allocate(tmbuff(size(buffer)+2*MPI_bsend_overhead))
22        call MPI_Buffer_attach(tmbuff, size(tmbuff), ierr)
23 
24        call MPI_bsend(buffer,msize-1,MPI_double_precision,1,2000,MPI_comm_world,status,ierr)
25        call MPI_bsend(buffer,1,      MPI_double_precision,1,2001,MPI_comm_world,status,ierr)
26         
27        call MPI_buffer_detach(tmbuff, size(tmbuff), ierr)
28         
29    else if (myid==1) then
30        call MPI_recv(b,msize-1,MPI_double_precision,0,2000,MPI_comm_world,status,ierr)
31        print *,'b1 = ',b
32        call MPI_recv(buffer,1,      MPI_double_precision,0,2001,MPI_comm_world,status,ierr)
33        print *,'b2 = ',buffer
34    end if
35 
36 
37    call MPI_finalize(ierr)
38end program


少了status数组
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-3-13 08:09

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表