C 中的 MPI 和指针传输

标签 mpi

我遇到了一个新的小问题;

我有一个小指针叫做:

int *a;

现在 ..在我的 main 方法中的某个地方,我使用以下行为其分配了一些空间并分配了一个值:

a = (int *) malloc(sizeof(int));
*a=5;

..然后我尝试传输它(比如处理 1):

MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

在另一端,如果我尝试接收那个指针

int *b;
MPI_Recv(b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

printf("This is what I received: %d \n", *b);

我收到有关缓冲区的错误!

但是,如果我不声明 'b' 指针,而是执行以下操作:

int b;
MPI_Recv(&b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

printf("This is what I received: %d \n", b);

...一切似乎都很好!有人可以帮我弄清楚发生了什么以及如何只使用指针吗?

提前致谢!

最佳答案

行的含义

MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

如下:“a 是内存中的一个点,我有 1 个整数。发送它。`

在您上面发布的代码中,这是绝对正确的:a 确实指向一个整数,因此它被发送了。这就是为什么您可以使用第二种方法接收它的原因,因为该行的含义

MPI_Recv(&b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

是“接收 1 个整数,并将其存储在 &bb 是一个常规的 int,所以一切都很好。在第一个接收,您正在尝试将整数接收到 int* 变量中 b 没有指向分配的内存,所以 Recv 无处可写。但是,我应该指出:

永远不要将指针的内容传递给 MPI 中的另一个进程

MPI 进程无法读取彼此的内存,虚拟寻址使得一个进程的指针对另一个进程完全没有意义。

关于C 中的 MPI 和指针传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877057/

相关文章:

c++ - EXP的并行化

multithreading - mpi: MPI_INIT_THREAD 提供的支持级别

c - MPI_Gatherv 无法正常工作

c++ - 从 C++ 代码向 Fortran 90 代码发送 mpi 消息

performance - 使用 MPI_PACK() 的优势

c - 尝试将通信世界拆分为 MPI 中的多个通信世界或 block ?

c - 使用 MPI_Reduce 时检测到堆栈粉碎

c - MPI_Scatterv 不起作用

c - MPI 向工作人员发送信息时出现问题

c++ - boost::mpi 1.53 到位 all_reduce