1

这个问题纯粹出于好奇。

OpenMP 规范在“执行模型”部分中说明了以下内容:

"... it is possible and permitted to develop a program that executes correctly
as a parallel program but not as a sequential program ..."

那么这样一个程序的例子是什么?

4

2 回答 2

5

OpenMP 引入了底层串行语言中不存在的附加语义。将 OpenMP 部分视为一个明显的示例。在串行程序中,部分只是以预先确定的方式执行的连续代码块:从第一个到最后一个。使用 OpenMP,如果有足够的线程来处理它们,所有部分都可以并行执行。这可能导致在顺序情况下根本不可能发生的因果关系——例如,当程序顺序运行时,后面的代码块不能影响前一个代码块的执行。

高度人工的例子:

int flag = 0;

#pragma omp parallel sections
{
    #pragma omp section
    {
        while (!flag) {}
    }
    #pragma omp section
    {
        flag = 1;
    }
}

此代码在 2 个或更多 OpenMP 线程中执行得非常好,并且在作为串行编译或设置为 1 运行时陷入无限循环OMP_NUM_THREADS。如果两个部分不并行运行,则while循环永远不会结束,因为设置flag为 true 发生在循环之后在顺序代码中。

于 2013-06-09T15:38:18.673 回答
0

顺序模型只是简单地将 OpenMP 调用排除在外。这意味着即使代码看起来像这样,也不会执行某些操作。

这并不是说没有任何算法可以按顺序解决问题——只是某些程序,AS WRITTEN,如果没有正常的 OpenMP 调用在并行模式下工作,可能无法得出正确的答案。

于 2013-06-09T07:16:12.087 回答