使用MPI和C,我希望分发(散射和聚集)复杂双值的2D数组(即2D阵列中的每个元素都是复数双类型,所以有一个 creal 和 cimag 组件。如果我使用大小 n -by- n 的二维数组的常规声明:
double complex grid[n][n];
一切正常,但我的程序将失败,具体取决于 n 的大小,给出一个"分段错误"错误。比如256以上的任何内容都会立即吐出一个"分段错误"错误。这就是我遇到的问题,而且我很难弄明白
在浏览了许多类似的问题之后,我猜测我的问题是我超载了堆栈内存(事实上我真的不是100%理解),这意味着我需要动态分配我的2D使用 malloc 或 calloc 的数组。
但是,根据我的理解,分配一个可以像grid [n] [n]一样调用的2D数组不会起作用,因为分配的内存不一定是对齐的,这意味着MPI_Scatter会失败。
double complex **alloc_2d_complex(int rows, int cols){
double complex *data = (complex double*) malloc(rows*cols*sizeof(complex double));
double complex **array = (complex double**) malloc(rows*sizeof(complex double*));
int i;
for (i = 0; i < rows; i++)
array[i] = &(data[cols*i]);
return array;
}
int main(int argc, char*argv[]){
double complex **grid;
grid = alloc_2d_complex(n,n);
/* Continue to initialize MPI and attempt Scatter... */
}
我已尝试通过此方法初始化2D,并且分散对我来说失败,给出错误&#34; memcpy参数内存范围重叠&#34;因为记忆中的某些东西显然没有正确排列
这意味着我必须以行主顺序分配一维数组中的所有内容,例如:
grid[y][x] ==> grid[y*n + x]
我真的,非常试图避免这种情况,因为我处理了许多转置和非转置矩阵(这很难以跟踪[y] [x]为了我的目的,它会让事情变得难以跟踪,但很好,如果它是我必须做的事情,那么让我们把它完成。但这个ALSO并没有与MPI_Scatter一起工作,再一次给了我&#34; memcpy&#34;错误,我完全傻眼了。下面是我尝试使用一维数组执行所有操作的示例。由于我为此和2D分配的数组得到了相同的错误,因此2D分配可能会起作用,我在这里遗漏了一些东西。我只使用了许多处理器 numProcs ,它们可以均匀地划分 n 。
int n = 128;
double complex *grid = malloc(n*n*sizeof(complex double));
/* ... Initialize MPI ... */
stepSize = (int) n/numProcs;
double complex *gridChunk = malloc(stepSize*n*sizeof(complex double));
/* ... Initialize grid[y*n+x] Values... */
MPI_Scatter(&grid, n*stepSize, MPI_C_DOUBLE_COMPLEX,
&gridChunk, n*stepSize, MPI_C_DOUBLE_COMPLEX,
0, MPI_COMM_WORLD);