OpenMP任务依赖性忽略了
OpenMP Task Dependency Ignored?
首先,这是示例代码:
#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
的依赖关系。由于队列中没有具有out
或inout
依赖项的现有任务,因此该任务已准备就绪,即使在遇到第二个任务之前,该任务也可能会执行。
如果我交换了这两个任务:
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
依赖。
相关文章:
- 有没有任务栏API可以立即应用注册表更改
- 如何创建线程序列以按照启动顺序执行任务?
- C++一个线程如何正确通信其任务已完成?
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- C++ 任务流库入门
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 编写一个读取五个整数并执行一些任务的C++程序
- 任务内部的 OpenMP 任务循环
- 不知道如何在家庭作业任务中实现一件事
- 如何安全地停止 IOCP WSARecv() 任务,并释放 WSAOVERLAPED 结构?
- 为什么我的 FreeRTOS 任务看不到类成员?
- 当前步骤:构建任务.json 文件
- 命令模式 - 使用"weight"执行任务的命令
- 无法删除EXE崩溃后,即使进程未显示在任务管理器中
- 需要帮助来理解我的任务的 QRegularExpression
- xSemaphoreTake 在调用 xSemaphoreGive 后不会恢复任务
- OpenMP任务依赖性忽略了