0

我有一个串行版本的 BML,我正在尝试用 OpenMP 编写一个并行版本。基本上,我的代码使用main一个循环调用两个函数来进行水平和垂直移动。像那样:

for (s = 0; s < nmovss; s++) {
        horizontal_movs(grid, N);
        copy_sides(grid, N);
        cur = 1-cur;
        vertical_movs(grid, N);
        copy_sides(grid, N);
        cur = 1-cur;
}

cur当前网格在哪里。那么水平和垂直函数是类似的,并且有一个嵌套循环:

for(i = 1; i <= n; i++) {
    for(j = 1; j <= n+1; j++) {
        if(grid[cur][i][j-1] == LR && grid[cur][i][j] == EMPTY) {
            grid[1-cur][i][j-1] = EMPTY;
            grid[1-cur][i][j] = LR;
        }
        else {
            grid[1-cur][i][j] = grid[cur][i][j];
        }
    }
}

该代码在每一步都会生成一个 ppm 图像,并且通过某个输入,串行版本会生成一个我们可以认为是好的输出。但是#pragma omp parallel for在两个函数 H 和 V 中使用时,ppm 文件的结果分为线程数(即 4)等区域:

最后一步

我想问题是每个线程都应该在白蚁之前按顺序执行这两个功能,因为 movememnts 是严格连接的。我不知道该怎么做。如果我像在主循环之前那样将 pragma 设置为更高级别,则没有加速。显然 ppm 文件不能像图像一样被切片。

4

1 回答 1

0

Goin'on 我尝试了这个解决方案,它给了我与串行代码相同的结果,但我不明白为什么

#   pragma omp parallel num_threads(thread_count) default(none) \
    shared(grid, n, cur) private(i, j)
    for(i = 1; i <= n+1; i++) {
#       pragma omp for
        for(j = 1; j <= n; j++) {
            if(grid[cur][i-1][j] == TB && grid[cur][i][j] == EMPTY) {
                grid[1-cur][i-1][j] = EMPTY;
                grid[1-cur][i][j] = TB;
            }
            else {
                grid[1-cur][i][j] = grid[cur][i][j];
            }
        }
    }
}

因此,如果我只使用一个多于可用内核的线程(4),则执行时间会“爆炸”而不是几乎保持不变。

于 2017-08-21T19:57:32.343 回答