Openmp生活并行游戏:不适用于大型矩阵

时间:2018-09-13 01:08:18

标签: c malloc openmp

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

0 个答案:

没有答案