Распараллелить игру из жизни Openmp: не работает для большой матрицы - PullRequest
0 голосов
/ 13 сентября 2018

Вот мой код для игры жизни Конвея с 4 соседями. Я должен экспериментировать с матрицами размером 128X128, 256X256, 512X512, 1024x1024, 2048x2048.

Последовательный код не запускается (окно запуска открывается и сразу же закрывается) после матрицы размером 512, в то время как распараллеленный код не запускается после матрицы размера 256. Там нет ошибок компиляции, хотя.

До массива размером 256, он работает нормально и дает ускорение 5,44. Может ли кто-нибудь помочь, пожалуйста?

Распределительная сетка:

grid= malloc(sizeof(int*)*ROWS);
for (i = 0 ; i < ROWS ; i++){
   grid[i] = malloc(sizeof(int)*COLS);
}

Параллельный код:

#pragma omp parallel
{

for (i = 0 ; i < 100 ; i++){
    grid=process(grid, ROWS, COLS);
}
}

функция процесса:

int process(int **grid, int ROWS, int COLS) {
    int population = 0;
    int neighbors;
    int tempGrid[ROWS][COLS];
    int i=0;
    int j=0;
    int t=0;

    #pragma omp for private(t, neighbors, tempGrid) 
    for(t = 0; t < ROWS*COLS; t++) {
        i=t/COLS;
        j=t%COLS;
            if (grid[i][j] == -1) {
                continue;
            }
            neighbors = neighbors(i, j, grid, ROWS, COLS);
            if (grid[i][j] == 0) {
                if (neighbors == 3) {
                    tempGrid[i][j] = 1;
                } else {
                    tempGrid[i][j] = 0;
                }
            } else if (grid[i][j] == 1) {
                if (neighbors < 2 || neighbors > 3) {
                    tempGrid[i][j] = 0;
                } else {
                    tempGrid[i][j] = 1;
                }
            }

    }

    for(i = 0; i < ROWS; i++) {
        for(j = 0; j < COLS; j++) {

            grid[i][j] = tempGrid[i][j];
//           printf("%d", grid[i][j]); 
        }
//       printf("\n"); 
    }
//   printf("\n"); 
return grid;

функция соседей:

int neighbors(int row, int col, int **grid, int ROWS, int COLS) {
    int neighbors = 0;
    int i=0;
    int j=0;

    for(i = row - 1; i < row + 2; i++) {
        for(j = col - 1; j < col + 2; j++) {
            if (i == row && j == col) {
                continue;
            }
            if (i > -1 && j > -1 && i < ROWS && j < COLS && i==row && j!=col) {
                neighbors += grid[i][j];
            }
            if (i > -1 && j > -1 && i < ROWS && j < COLS && i!=row && j==col) {
                neighbors += grid[i][j];
            }
        }
    }
    return neighbors;
}
...