对于我的Parallel Computing类中的项目,我需要实现Game of Life的并行版本。
我正在使用我的教科书作者“read_row_stripped_matrix”编写的函数。此函数从包含矩阵中行数,矩阵中列数和矩阵中数据的文件中读取输入。
该函数通过分配称为“存储”的一维数组来设置二维矩阵,该数组保存所有矩阵的数据。二维矩阵的每一行指向存储器中的第一个元素,如下图所示:
我们需要清理功能代码,使其符合我们的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;
}
老实说,我发现指针令人困惑,如果问题很明显,请原谅我。我一直在研究这个问题比我应该做的更长,所以我的大脑可能已经油炸了。
如果您需要更多代码,请不要犹豫。
答案 0 :(得分:2)
首先,你这样做:
*subs = my_malloc (id, local_rows * PTR_SIZE);
然后,你这样做:
*subs[i]=&(*storage[i * *n]);
很确定那是你的问题,就在那里。在我看来它应该是真的:
(*subs)[i]=&(*storage[i * *n]);