【问题标题】:Sending an int array via MPI_Send通过 MPI_Send 发送一个 int 数组
【发布时间】:2019-04-29 13:16:54
【问题描述】:

我是 MPI 的新手,我想通过 MPI_Send 向另一个进程发送一个 int 数组。

// Code example

      int main(int argc, char ** argv)
      {
       int * array;
       int tag=1;
       int size;
       int rank;
       MPI_Status status;
       MPI_Init (&argc,&argv);
       MPI_Comm_size (MPI_COMM_WORLD,&size);
       MPI_Comm_rank (MPI_COMM_WORLD,&rank);
       if (rank == 0)
       {
         array = malloc (10 * sizeof(int)); // Array of 10 elements
         if (!array) // error checking
         {
          MPI_Abort (MPI_COMM_WORLD,1);
         }
       MPI_Send(&array,10,MPI_INT,1,tag,MPI_COMM_WORLD);
       }
       if (rank == 1)
       {
        MPI_Recv (&array,10,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
        // more code here
       }
      MPI_Finalize();
// More code here

我想问三件事。

  1. 这是将数组发送到另一个进程等级的安全方式吗?
  2. MPI_Send()MPI_Recv() 的语法正确用法吗?
  3. 有没有更好的方法来发送和接收数组而不会太麻烦?

感谢任何帮助。

【问题讨论】:

  • 我建议在跳入 MPI 之前重新学习有关 C 中指针的基础知识。
  • MPI_Recv() 不会为您分配数组。 MPI_Send()MPI_Recv() 都需要指向数据的指针,而不是指向数据的指针的地址。

标签: c mpi openmpi


【解决方案1】:

如果要动态分配数组,发送和接收将是:

MPI_Send(array,10,MPI_INT,1,tag,MPI_COMM_WORLD);

MPI_Recv (array,10,MPI_INT,0,tag,MPI_COMM_WORLD,&status);

(注意数组是array 而不是&array

正如 cmets 中所建议的,您对 MPI 的理解似乎很好,但重新使用 C 指针可能会有所帮助。

编辑:正如 Gilles 所提到的,所有将数据接收到数组中的进程也需要为它们分配内存。 (也许先发送数据的大小,以便接收者知道分配数组的大小?还有其他方法可以做到这一点,但这是一个简单的解释)

【讨论】:

  • array 也必须分配在接收器上!
  • 吉尔斯大喊一声!
猜你喜欢
  • 2018-03-08
  • 2013-04-07
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2013-12-06
相关资源
最近更新 更多