【发布时间】:2017-07-29 21:58:46
【问题描述】:
我开发了一个涉及网格处理的分布式内存 MPI 应用程序。现在我想通过 OpenMP 应用共享内存技术(本质上使其成为混合 - 并行程序),看看它是否可以变得更快或更高效。我很难使用 OpenMP,尤其是嵌套的 for 循环。我的应用程序涉及每半秒将网格打印到屏幕上,但是当我使用 OpenMP 并行化它时,执行速度会慢 10 倍,或者根本不会。控制台屏幕滞后并使用随机/意外数据自行刷新。换句话说,这是完全错误的。看看下面的打印函数:
void display2dGrid(char** grid, int nrows, int ncolumns, int ngen)
{
//#pragma omp parallel
updateScreen();
int y, x;
//#pragma omp parallel shared(grid) // garbage
//#pragma omp parallel private(y) // garbage output!
//#pragma omp for
for (y = 0; y < nrows; y++) {
//#pragma omp parallel shared(grid) // nothing?
//#pragma omp parallel private(x) // 10 times slower!
for (x = 0; x < ncolumns; x++) {
printf("%c ", grid[y][x]);
}
printf("\n");
}
printf("Gen #%d\n", ngen);
fflush(stdout);
}
(updateScreen() 只是清屏并再次从左上角写入。)
该函数仅由一个进程执行,这使其成为线程并行化的完美目标。如您所见,我尝试了很多方法,其中一种方法比另一种更糟。最好的情况是,我每 2 秒得到半正确的输出(因为它刷新非常慢)。最坏的情况是我得到垃圾输出。
如果有任何帮助,我将不胜感激。有没有一个地方我可以找到更多信息来使用 OpenMP 正确并行化循环?提前致谢。
【问题讨论】:
-
我理解正确吗?您希望多个线程同时写入(某种程度)到控制台而不是垃圾?您希望多个线程争夺对单个通道的访问权以写入屏幕并让这个通道愉快地进行?
-
如果您使用的序列随机数生成器也会破坏并行性。
标签: multithreading for-loop parallel-processing openmp