这个问题纯粹出于好奇。
OpenMP 规范在“执行模型”部分中说明了以下内容:
"... it is possible and permitted to develop a program that executes correctly
as a parallel program but not as a sequential program ..."
那么这样一个程序的例子是什么?
这个问题纯粹出于好奇。
OpenMP 规范在“执行模型”部分中说明了以下内容:
"... it is possible and permitted to develop a program that executes correctly
as a parallel program but not as a sequential program ..."
那么这样一个程序的例子是什么?
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 发生在循环之后在顺序代码中。
顺序模型只是简单地将 OpenMP 调用排除在外。这意味着即使代码看起来像这样,也不会执行某些操作。
这并不是说没有任何算法可以按顺序解决问题——只是某些程序,AS WRITTEN,如果没有正常的 OpenMP 调用在并行模式下工作,可能无法得出正确的答案。