c - 为什么进程 0 不接收来自自身的数据?

标签 c mpi blocking nonblocking

我刚开始学习MPI,遇到问题的原因我不清楚。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <mpi.h>


int main(int argc, char *argv[])
{
    int myRank, size;
    double myLeftBound, myRightBound;
    MPI_Status status1;
    MPI_Status status2;
    MPI_Request request1;
    MPI_Request request2;   

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);   


    if (myRank == 0)
    {
        int counter;

        for (counter = size - 1; counter >= 0; counter--)
        {
            myLeftBound = 0;
            myRightBound = 1;
            MPI_Isend(&myLeftBound, 1, MPI_DOUBLE, counter, 2 * counter, MPI_COMM_WORLD, &request1);
            MPI_Isend(&myRightBound, 1, MPI_DOUBLE, counter, 2 * counter + 1, MPI_COMM_WORLD, &request2);   
        }
    }

    MPI_Recv(&myLeftBound, 1, MPI_DOUBLE, 0, myRank * 2, MPI_COMM_WORLD, &status1);
    MPI_Recv(&myRightBound, 1, MPI_DOUBLE, 0, myRank * 2 + 1, MPI_COMM_WORLD, &status2);
    printf ("I received my left boundary %f\n, I'm %d\n", myLeftBound, myRank);
    MPI_Finalize();
    return 0;
}

其中一个输出如下(进程数为4)

I received my left boundary 0.000000

, I'm 1

I received my left boundary 0.000000

, I'm 2

I received my left boundary 0.000000

, I'm 3

Assertion failed in file src/mpid/ch3/src/ch3u_buffer.c at line 77: FALSE memcpy argument memory ranges overlap, dst_=0x7ffcc26963d0 src_=0x7ffcc26963d0 len_=8

internal ABORT - process 0

进程 0 出了什么问题?

最佳答案

你不能接收到你正在发送的同一个缓冲区。从技术上讲,在完成非阻塞发送操作之前,您不得修改发送缓冲区的任何部分。您还应该完成发送操作,这意味着您应该将其存储在多个请求对象中。

无论如何,只需使用 MPI_Bcast 并在以后对 MPI 有更多经验时留下非阻塞操作。由于某种原因,它们经常被初学者过度使用和错误使用。

关于c - 为什么进程 0 不接收来自自身的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42461012/

相关文章:

c - 使用 C 读取字符串中的每个单词并在不同行上打印每个单词的函数

mysql - MySQL有没有办法等待符合条件的行被插入

c++ - 异步 glTexSubImage2D 和 OGL 线程阻塞

python - 让 python 程序和 c 程序共享数据的最佳方法是什么

c - 在函数中使用指针的临时值

c - 使用 C 中的结构正确实现 GCD

C++ - Sleep() 和 cin 是如何工作的?

c - 如何在 MPI 中发送结构指针

c - 将作业分配给线程 - MPI

c - MPICH:如何发布_name 以便客户端应用程序可以查找_name 呢?