【问题标题】:How to send pointer in struct in MPI如何在 MPI 结构中发送指针
【发布时间】:2015-11-19 22:58:48
【问题描述】:

我有这样的结构:

typedef struct
{
    int x;
    double *y;
    int **z;
}
ind;

如何通过 MPI 将 *y 和 **z 之类的指针发送到其他进程?我知道很多答案都说从不通过 MPI 发送指针。但是如果我不能将 *y 更改为数组,因为它在主程序的其他部分中使用,我应该怎么做才能通过 MPI 通过进程传输它们?尤其是**z,我该怎么办? 提前致谢!

【问题讨论】:

  • 我想你不能。假设一个进程修改了*y,其他进程怎么知道*y 改变了?
  • 你不能发送一个指针,因为它在分配它的进程之外是没有意义的。如果您想发送它指向的数据数组,请改为提出该问题。
  • 对不起。我是编程新手。也许我没有清楚地描述这个问题。我确实想发送它指向的数据数组。您能否为此提供一些线索。非常感谢!

标签: c pointers struct mpi


【解决方案1】:

按照第二个示例here 中的代码,我执行了以下操作。我相信这就是你想要的。

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

int main(int argc, char *argv[]) {
  int *send, *recv;
  int rank, i;
  MPI_Status status;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  send = malloc(sizeof(int)*10);
  recv = malloc(sizeof(int)*10);

  for (i=0;i<10;i++)
    send[i] = 5*i;

  if (rank == 0)
    MPI_Send(send, 10, MPI_INT, 1, 0, MPI_COMM_WORLD);
  else {
    MPI_Recv(recv, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);

    for (i=0;i<10;i++)
      printf("%d\n", recv[i]);
  }

  MPI_Finalize();
  return 0;
}

运行它输出,

$ mpiexec -n 2 mpi_test
0
5
10
15
20
25
30
35
40
45

现在你只需要适应你自己的问题。

【讨论】:

  • 感谢您的帮助。如果我想构建一个 MPI_struct 以包含 ind 结构中的所有元素并将它们作为 MPI_type 发送怎么办?如何处理指针?特别是指针指向的数组的MPI_address如何计算?
  • 如果你指的是mpich.org/static/docs/v3.1/www3/MPI_Type_create_struct.html,那么我会说你不能直接。我建议创建一个单独的函数(如果你愿意,你可以在 MPI 之后建模),它会像我发布的那样发送你的数据结构。一堆发送/接收/广播/等。正确传输您的数据结构。那会奏效的。
  • 你也可以让这个函数序列化你的数据,方法是把它打包到一个可以在接收端解包的缓冲区中。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 2013-04-22
  • 2011-08-23
  • 2013-11-18
  • 2021-06-11
  • 2020-07-18
  • 1970-01-01
  • 2014-12-20
相关资源
最近更新 更多