用MPI共享动态分配的二维数组[重复]。

问题描述 投票:0回答:1

我试图在一个函数中使用c语言中的MPI将一个动态分配的2D数组从一个主线程共享给其他几个线程。

相关代码的简化表示如下。

//Initialize program, start up the desired number of threads.
//Master thread takes input from user, dynamically allocates and constructs 2d array.
//All threads call method analyze_inputs(**array), which takes the array as input (all threads other than master simply pass NULL as argument)
//The master thread shares the array, along with work division to all other threads:
{//Master thread
  MPI_Send(&x, 1, MPI_INT, recievingThread, 0, MPI_COMM_WORLD);
  MPI_Send(&y, 1, MPI_INT, recievingThread, 0, MPI_COMM_WORLD);
  MPI_Send(&(array[0][0]), x*y, MPI_INT, recievingThread, 0, MPI_COMM_WORLD);
}

{//Subthreads
  MPI_Recv(&x, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  MPI_Recv(&y, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  MPI_Recv(&(array[0][0]), x*y, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}

这是我在这个网站上找到的一个发送动态分配2D数组的方法 但是我收到的数组出现了分割错误

我如何才能做到这一点?

编辑:最小的可复制的例子

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

int analyze_inputs (int x, int y, int** array);

int main (int argc, char **argv)
{
  int x = 10;
  int y = 8;
  int rank;
  int **array = NULL;

  MPI_Init (&argc, &argv);
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);
  if (rank == 0)
  {
    array = malloc(x * sizeof(int*));
    for (int i = 0; i < x; i++)
    {
      array[i] = malloc(y * sizeof(int));
    }

    for (int i = 0; i < x; i++)
    {
      for (int j = 0; j < y; j++)
      {
        array[i][j] = rand();
      }
    }
  }
  analyze_inputs(x,y,array);
  MPI_Finalize ();
}

int analyze_inputs(int x,int y, int** array)
{
  int rank, x_temp, y_temp, **array_temp;
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);

  if (rank == 0)
  {
    MPI_Send(&x, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    MPI_Send(&y, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    MPI_Send(&(array[0][0]), x*y, MPI_INT, 1, 0, MPI_COMM_WORLD);
  }
  else
  {
    MPI_Recv(&x_temp, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    MPI_Recv(&y_temp, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Works to here.\n");
    MPI_Recv(&(array_temp[0][0]), x_temp*y_temp, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Crashes before here.\n");
  }
}
c segmentation-fault mpi dynamic-memory-allocation
1个回答
0
投票

每一行的 array 在你的代码中是单独分配的,所以简单的

MPI_Send(&(array[0][0]), x*y, MPI_INT, 1, 0, MPI_COMM_WORLD);

在这种情况下是行不通的。

一个简单的解决方案是像这样分配一个单块的内存。

array = malloc(x * sizeof(int*));
array[0] = malloc(y * x * sizeof(int));
for (int i = 1; i < x; i++)
{
  array[i] = array[0] + y * i;
}

而释放这个数组将是

free(array[0]);
free(array);

不要免费 array[1], array[2]......在这种情况下,因为他们已经被释放了。free(array[0]);.

© www.soinside.com 2019 - 2024. All rights reserved.