OpenMP任务依赖被忽略了吗?

3

首先,这是示例代码:

#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 = %d\n", x); // prints 202
}

据我所知,task depend(in: x)应该等待具有depend(out: x)的任何内容,但似乎并没有发生这种情况。
在这种特定情况下,输出结果为202,表明先增加x,然后再加倍。
事实上,我尝试了in/out和out/in,以及交换任务定义顺序。无论如何,在/出依赖关系的情况下,任务始终从上到下执行。
我是否误解了task depend的含义?
1个回答

4

这个实现正在做正确的事情。

除了通过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 = %d\n", x); // prints 201
}

代码按预期输出201。我使用Intel编译器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 = %d\n", x); // prints 201
}

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


1
你的两个代码片段是相同的,你可能需要更新 // prints 的注释。 - Zulan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接