MPI Scatter 2D Выделенный комплекс Double

Используя MPI и C, я стремлюсь распределить (разбросать и собрать) двумерный массив сложных двойных значений (т. Е. Каждый элемент в двумерном массиве имеет тип complex double, поэтому имеет компонент creal и cimag). Если я использую обычное объявление двумерного массива размером n- by- n:

double complex grid[n][n];

Все работает просто отлично, НО моя программа не сработает в зависимости от размера n, выдав ошибку "ошибка сегментации". Все, что выше, скажем, 256, немедленно выдаст ошибку "ошибка сегментации". Это проблема, с которой я столкнулся и до сих пор не могу ее понять.

После просмотра многочисленных подобных проблем, я предполагаю, что моя проблема заключается в том, что я перегружаю стековую память (что я, честно говоря, не на 100% понимаю), что означает, что мне нужно динамически распределять свои 2D-массивы с помощью malloc или calloc.

Однако, в моем понимании, выделение двумерного массива, который можно назвать как grid[n][n], не будет работать, поскольку выделенная память не обязательно выровнена, что означает сбой 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 с помощью этого метода, и разброс для меня не удался, выдавая ошибки "пересекаются диапазоны памяти аргументов memcpy", поскольку что-то в памяти, по-видимому, неправильно выстраивается.

Это означает, что я должен размещать все в одномерных массивах в главном порядке строк, например:

grid[y][x] ==> grid[y*n + x]

Я действительно, действительно пытаюсь избежать этого, потому что я имею дело с многочисленными транспонированными и нетранспонированными матрицами (что достаточно сложно отслеживать в логике [y][x]), и это будет усложнять отслеживание для моей цели, но хорошо, если это то, что я должен сделать, тогда давайте покончим с этим. Но это ТАКЖЕ не работает с MPI_Scatter, давая мне еще раз "memcpy" ошибки, которые я совершенно ошеломлен. Ниже приведен пример того, как я пытаюсь сделать все, используя одномерные массивы. Так как я получаю ту же ошибку для этого и 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 ответов

Другие вопросы по тегам