【问题标题】:OpenMP task outputOpenMP 任务输出
【发布时间】:2020-06-25 15:01:48
【问题描述】:

我不明白下面的问题:

指定代码在使用-fopenmp 编译并使用两个 OpenMP 线程执行时可能的输出:

int x = 0; 
#pragma omp parallel
{
    #pragma omp single
    {
        #pragma omp task
        {
            x++;
            printf("task 1: %d\n", x);
        }
        #pragma omp task
        {
            x++;
            printf("task 2: %d\n", x);
        }
    }
}

-fopenmp 对此有何“特殊”影响?

这些是可能的输出吗:

  1. 任务 1:1,任务 2:2
  2. 任务 2:1,任务 1:2

其他可能的输出呢?

【问题讨论】:

  • -fopenmp 最“特殊”的影响可能是它可以处理代码中的所有 OpenMP pragmas。

标签: multithreading parallel-processing openmp


【解决方案1】:

您展示的两种可能性:

  1. 任务 1:1

    任务 2:2

  2. 任务 2:1

    任务 1:2

x++在两个任务中首先执行,然后打印第一个任务然后是第二个:

  1. 任务 1:2

    任务 2:2

x++在两个任务中首先执行,然后打印第二个任务然后第一个:

  1. 任务 2:2

    任务 1:2

【讨论】:

  • x++ 在两个任务中同时执行并且你得到task 1: 1task 2: 1,任务的顺序也相反时会怎样?
【解决方案2】:

如果没有-fopenmp,代码将被编译成一个顺序程序(所有 OpenMP pragma 都会被忽略)。

另外两个可能的输出来自两个任务同时执行(指令交错)的情况。实际上,虽然这两个任务是在一个单个线程中顺序提交的,但每个任务都可以由不同的线程同时执行(因为没有任务依赖关系,也没有关键部分)。结果,两个x++可以在两个printf之前执行(以任意顺序执行)。由于竞态条件,这样的代码显然不安全

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多