Вот мой код для игры жизни Конвея с 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;
}