这个问题出于好奇。
OpenMP规范在“执行模型”部分中说明了以下内容:
"... it is possible and permitted to develop a program that executes correctly
as a parallel program but not as a sequential program ..."
那么这样一个程序的例子是什么?
答案 0 :(得分:5)
OpenMP引入了底层串行语言中不存在的其他语义。将OpenMP部分视为一个明显的例子。在串行程序中,部分是简单的连续代码块,以强预定的方式执行:从第一个到最后一个。使用OpenMP,如果有足够的线程来处理它们,所有部分都可以并行执行。这可能导致在顺序情况下根本不可能的因果关系 - 例如,当程序顺序运行时,后面的代码块不能影响前一个代码块的执行。
高度人为的例子:
int flag = 0;
#pragma omp parallel sections
{
#pragma omp section
{
while (!flag) {}
}
#pragma omp section
{
flag = 1;
}
}
此代码与2个或更多OpenMP线程完美匹配,并在编译为串行时进入无限循环,或者在OMP_NUM_THREADS
设置为1的情况下运行。如果两个部分不并行运行,{{1循环永远不会结束,因为在顺序代码中的循环之后将while
设置为true。
答案 1 :(得分:0)
顺序模型只是简单地存在OpenMP调用。这意味着即使代码看起来像是这样,也不会采取某些操作。
这并不是说没有可能顺序解决问题的算法 - 只是如果没有正常的OpenMP调用以并行模式工作,某些程序如AS WRITTEN可能无法得到正确答案。