c - 是否有一个程序可以作为并行程序正确执行但不能作为顺序程序正确执行?

标签 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 ..."

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

最佳答案

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/

相关文章:

c++ - 编写 std::vector 与普通数组的线程安全

java - JVM 规范和 Java 编译器代码对 SCJP 准备有用吗?

c++ - 编译多源程序文件时,MinGW 是否创建目标文件?

c 答案错误

c++ - OpenMp 任务 : can't pass argument by reference

java - 箭头(->)运算符优先级/优先级最低,或者赋值/组合赋值的优先级最低?

mysql - 快速选择后续记录 block

c - 我怎样才能获得哪个变量具有最高值?

用于操作的 C 指针转换

multithreading - Cython:使 prange 并行化线程安全