我已经将" pragma omp用于"循环,现在想尝试OpenMP任务。 但是一个简单的程序,它应该并行运行2个任务似乎不起作用。 我是否误解了任务的使用或这里有什么问题?
#include<iostream>
#include<omp.h>
//ubuntu 12.04 LTS, gcc 4.6.3
//g++ test_omp.cpp -fopenmp
int main()
{
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task
{
while(true)
{
usleep(1e6);
#pragma omp critical (c_out)
std::cout<<"task1"<<std::endl;
}
}
#pragma omp task
{
while(true)
{
usleep(1e6);
#pragma omp critical (c_out)
std::cout<<"task2"<<std::endl;
}
}
}
}
}
输出是: 任务1 任务1 任务1 .....
所以第二项任务没有运行。
答案 0 :(得分:3)
来自OpenMP规范:
当线程遇到任务构造时,会生成一个任务 相关结构化块的代码。的数据环境 根据数据共享属性子句创建任务 任务构造,每数据环境ICV以及任何默认值 应用。
遇到的线程可能会立即执行任务,或 推迟执行。在后一种情况下,团队中的任何线程都可以 分配任务。使用任务可以保证任务的完成 同步结构。任务构造可以嵌套在 外部任务,但内部任务的任务区域不是其中的一部分 外部任务的任务区域。
(强调我的)
我读这个的方式:一个线程开始执行你的single
部分。它到达task
指令,此时它可以决定自己运行任务,还是将其交给另一个线程。当它决定自己运行任务时会发生问题 - 它永远不会返回。
我不太确定为什么你的例子中有task
/ single
。您想要做的事情似乎是omp parallel sections
的情况:
int main()
{
#pragma omp parallel sections num_threads(2)
{
#pragma omp section
{
while(true)
{
usleep(3e5);
#pragma omp critical (c_out)
std::cout<<"task1"<<std::endl;
}
}
#pragma omp section
{
while(true)
{
usleep(5e5);
#pragma omp critical (c_out)
std::cout<<"task2"<<std::endl;
}
}
}
}