是否有一个程序作为并行程序正确执行但不作为顺序程序?

时间:2013-06-09 06:50:53

标签: c openmp specifications

这个问题出于好奇。

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

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

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

2 个答案:

答案 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可能无法得到正确答案。