OpenMP任务依赖性忽略了

OpenMP Task Dependency Ignored?

本文关键字:依赖性 任务 OpenMP      更新时间:2023-10-16

首先,这是示例代码:

#include <iostream>
int main()
{
    int x = 100;
    #pragma omp parallel
    {
        #pragma omp single
        {
            #pragma omp task depend (in: x)
            { x += 1; }
            #pragma omp task depend (out: x)
            { x *= 2; }            
        }
    }
    printf("x = %dn", x); // prints 202
}

据我了解,task depend(in: x)应该等待depend(out: x)的任何内容,但这似乎不是发生的事情。

在这种特殊情况下,输出为 202,表明x首先增加然后加倍。

实际上,我已经尝试了内外/输出/输入,并切换了定义任务本身的顺序。不管IN/OUT依赖关系如何,任务始终执行上下。

我误解了task depend的含义?

实现正在做正确的事情。

除了通过depend子句确定的顺序外,任务创建在源代码中的位置也会影响依赖关系。

在您的示例中,第一个任务对x变量具有in的依赖关系。由于队列中没有具有outinout依赖项的现有任务,因此该任务已准备就绪,即使在遇到第二个任务之前,该任务也可能会执行。

> 。

如果我交换了这两个任务:

int main()
{
    int x = 100;
    #pragma omp parallel
    {
        #pragma omp single
        {
            #pragma omp task depend (out: x)
            { x *= 2; }
            #pragma omp task depend (in: x)
            { x += 1; }
        }
    }
    printf("x = %dn", x); // prints 201
}

代码打印201,如预期的。我用英特尔编译器18.0.3。

对此进行了测试。

正确的代码任务依赖性建模将如下所示:

int main()
{
    int x = 100;
    #pragma omp parallel
    {
        #pragma omp single
        {
            #pragma omp task depend (inout: x)
            { x *= 2; }
            #pragma omp task depend (inout: x)
            { x += 1; }
        }
    }
    printf("x = %dn", x); // prints 201
}

代码仍然打印202,但是现在依赖性正确地对x的实际用法建模:任务1读取x的旧值并对其进行修改,因此应使用inout依赖关系。任务2还读取x并修改它,因此它也应使用inout依赖。