gpt4 book ai didi

gcc openmp 任务不起作用

转载 作者:行者123 更新时间:2023-12-04 20:45:10 24 4
gpt4 key购买 nike

我已经将 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;
}
}

}
}
}

输出是:
任务1
任务1
任务1
.....

所以第二个任务没有运行。

最佳答案

来自 OpenMP 规范:

When a thread encounters a task construct, a task is generated fromthe code for the associated structured block. The data environment ofthe task is created according to the data-sharing attribute clauses onthe task construct, per-data environment ICVs, and any defaults thatapply.

The encountering thread may immediately execute the task, ordefer its execution. In the latter case, any thread in the team may beassigned the task. Completion of the task can be guaranteed using tasksynchronization constructs. A task construct may be nested inside anouter task, but the task region of the inner task is not a part of thetask region of the outer task.


(强调我的)
我读这个的方式:单个线程开始执行您的 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;
}
}
}
}

关于gcc openmp 任务不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19220803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com