MPI Scatter 2D Allocated Complex Double

时间:2018-03-24 20:54:35

标签: mpi scatter

使用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);

0 个答案:

没有答案