我已经使用OpenMP和"pragma omp for"循环,并且现在想尝试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;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:task1 task1 task1 .....
所以第二个任务没有运行.
来自 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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
939 次 |
最近记录: |