我有一个串行版本的 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 文件不能像图像一样被切片。