<分区>
这个问题是出于好奇。
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 线程下执行得非常好,并且在编译为串行时或在 OMP_NUM_THREADS
设置为 1 的情况下运行时陷入无限循环。如果两个部分不并行运行,则while
循环永远不会结束,因为在顺序代码中将 flag
设置为 true 发生在循环之后。
关于c - 是否有一个程序可以作为并行程序正确执行但不能作为顺序程序正确执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17007191/