这是我与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;
}