生命实现游戏中的分割故障问题

时间:2015-03-09 01:52:29

标签: c segmentation-fault mpi

对于我的Parallel Computing类中的项目,我需要实现Game of Life的并行版本。

我正在使用我的教科书作者“read_row_stripped_matrix”编写的函数。此函数从包含矩阵中行数,矩阵中列数和矩阵中数据的文件中读取输入。

该函数通过分配称为“存储”的一维数组来设置二维矩阵,该数组保存所有矩阵的数据。二维矩阵的每一行指向存储器中的第一个元素,如下图所示:

enter image description here

我们需要清理功能代码,使其符合我们的C风格指南。所以我清理了一些东西,以便更具可读性。

我现在遇到的问题是将矩阵中的每一行指向存储中的第一个元素。我在连接这些指针时遇到了分段错误,特别是在函数的这一部分:

   /* Dynamically allocate matrix. Allow double subscripting
      through 'a'. */

   *storage = my_malloc (id, local_rows * *n * sizeof(int));       
   *subs    = my_malloc (id, local_rows * PTR_SIZE);

   for (i = 0; i < local_rows; i++) {
      *subs[i]=&(*storage[i * *n]);
   }

让我感到困惑的是,我非常确定我为阵列分配了足够的内存。在我正在测试的例子中,* m和* n等于5,并且local_rows等于5.所以我为存储分配25 * sizeof(int),这应该足以容纳5x5矩阵的所有元素。

这是my_malloc函数,它是特定处理器的malloc:

/*
 *   Function 'my_malloc' is called when a process wants
 *   to allocate some space from the heap. If the memory
 *   allocation fails, the process prints an error message
 *   and then aborts execution of the program.
 */

void* my_malloc (
   int id,     /* IN - Process rank */
   int bytes)  /* IN - Bytes to allocate */
{
   void *buffer;
   if ((buffer = malloc ((size_t) bytes)) == NULL) {
      printf ("Error: Malloc failed for process %d\n", id);
      fflush (stdout);
      MPI_Abort (MPI_COMM_WORLD, MALLOC_ERROR);
   }
   return buffer;
}

老实说,我发现指针令人困惑,如果问题很明显,请原谅我。我一直在研究这个问题比我应该做的更长,所以我的大脑可能已经油炸了。

如果您需要更多代码,请不要犹豫。

1 个答案:

答案 0 :(得分:2)

首先,你这样做:

*subs    = my_malloc (id, local_rows * PTR_SIZE);

然后,你这样做:

*subs[i]=&(*storage[i * *n]);

很确定那是你的问题,就在那里。在我看来它应该是真的:

(*subs)[i]=&(*storage[i * *n]);