MPI_Send的缓冲区大小问题

        最近一直在忙程序的搬家问题,其实说起来不能再简单了:就是把在公司调好的一个MPI程序搬到gz的大系统上去跑,本以为没啥问题的一个步骤实现起来却各种问题,既遇到编译的问题(第一篇博客中提到的)并解决之后,程序的运行也出现了错误。错误信息为“fatal error in MPI: other MPI error”,而且死掉的进程都是发送进程,这让我百思不解。

        然后我怀疑了各种问题尝试了各种方式:首先,使用gdb调试,但问题在于由于需要修改-O3的优化选项才能调试MPI程序,这导致了程序跑的奇慢……发火,等得受不了了;然后,我就只好回归了最原始的输出调试,但我又惊奇的发现,本应该输出的信息没有输出或者没有按顺序输出,实在是混淆视听发火,问了贵鑫才知道是因为缓冲区可能不满,所以利用flush解决了问题(语法为:cout<<"输出的内容"<<……<<flush);在输出信息的帮助下,我逐渐将出错的位置锁定在了用MPI_Send发送大文件的一条语句上,因为我发现,发送其他的信息比如文件名,文件大小等小的信息都可以正常接收,但发送文件时就出错,我怀疑可能是buffer大小的问题。因为文件名等信息的buffer设置为100个字节,而发送的文件比较大,采用循环发送的方式

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`MPI_Sendrecv` 函数是 MPI 库中的一个消息传递函数,它可以在一个函数调用中完成发送和接收操作,因此可以避免死锁等问题。 `MPI_Sendrecv` 函数的原型如下: ``` int MPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status) ``` 该函数有以下参数: - `sendbuf`:发送缓冲区的指针。 - `sendcount`:要发送的数据的数量。 - `sendtype`:要发送的数据的类型。 - `dest`:目标进程的标识符。 - `sendtag`:发送消息的标签。 - `recvbuf`:接收缓冲区的指针。 - `recvcount`:要接收的数据的数量。 - `recvtype`:要接收的数据的类型。 - `source`:发送消息的进程的标识符。 - `recvtag`:接收消息的标签。 - `comm`:通信子。 - `status`:接收消息的状态。 该函数的作用是将 `sendbuf` 中的 `sendcount` 个数据按照 `sendtype` 类型发送给进程 `dest`,并从进程 `source` 接收数据到 `recvbuf` 中,数据类型为 `recvtype`,数量为 `recvcount`,接收消息的标签为 `recvtag`,发送消息的标签为 `sendtag`,通信子为 `comm`。 需要注意的是,`MPI_Sendrecv` 函数是一个阻塞函数,也就是说,它会一直等待直到发送和接收都完成。在函数返回后,可以通过 `status` 参数来获取接收消息的状态。 下面是一个简单的例子: ```c #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { int rank, size; int sendbuf, recvbuf; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (rank == 0) { sendbuf = 123; MPI_Sendrecv(&sendbuf, 1, MPI_INT, 1, 0, &recvbuf, 1, MPI_INT, 1, 1, MPI_COMM_WORLD, &status); printf("Process %d sent %d and received %d\n", rank, sendbuf, recvbuf); } else if (rank == 1) { sendbuf = 456; MPI_Sendrecv(&sendbuf, 1, MPI_INT, 0, 1, &recvbuf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); printf("Process %d sent %d and received %d\n", rank, sendbuf, recvbuf); } MPI_Finalize(); return 0; } ``` 上面的代码中,进程 0 向进程 1 发送数据 123,同时接收来自进程 1 的数据。进程 1 向进程 0 发送数据 456,同时接收来自进程 0 的数据。最终输出结果为: ``` Process 0 sent 123 and received 456 Process 1 sent 456 and received 123 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值