作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到这样一种情况,我在一个 #pragma omp parallel
block 中有两个 #pragma omp task
第一个任务很简单,只需等待 5 秒。第二个任务是等待复杂的用户输入操作的更困难的工作。
bool timed_out=false;
#pragma omp parallel num_threads(2), shared(timed_out)
{
#pragma omp task
{
sleep(5);
#pragma omp atomic write
time_out=true;
}
#pragma omp task
{
// wait for user input
}
#pragma omp taskwait
}
基本上,我希望在成功接收到用户输入或达到 5 秒超时后发生什么,然后我想跳出 #pragma omp parallel
部分并继续主要内容。
我不认为我可以在 taskwait 之后使用 #pragma omp single
,因为如果收到用户输入,接下来会发生的事情是产生两个工作线程。
最佳答案
请注意,您的初始示例不会生成两个任务,而是生成四个任务,因为并行区域中的两个 OpenMP 线程中的每一个都会遇到 task
构造,从而创建一个任务。您必须用 master
或 single
构造包装两个 task
构造以避免这种情况并确保只有一个任务创建任务:
bool timed_out=false;
#pragma omp parallel num_threads(2), shared(timed_out)
{
#pragma omp master
{
#pragma omp task
{
sleep(5);
#pragma omp atomic write
time_out=true;
}
#pragma omp task
{
// wait for user input
}
#pragma omp taskwait
}
}
对于等待的第二个任务的终止,您可以使用 OpenMP 取消:
bool timed_out=false;
#pragma omp parallel master num_threads(2), shared(timed_out)
{
#pragma omp taskgroup
{
#pragma omp task
{
sleep(5);
#pragma omp atomic write
time_out=true;
#pragma omp cancel taskgroup
}
#pragma omp task
{
while(true) {
#pragma omp taskyield
#pragma omp cancellation point taskgroup
}
}
#pragma omp taskwait
}
需要taskgroup
来定义应受cancel
结构影响的任务。一旦遇到cancel
构造,等待任务中的取消点
构造将终止while
循环。由于第二个任务是自旋等待,它包含一个 taskyield
来引入任务调度点并允许 OpenMP 实现调度另一个任务(这对于你的最小示例来说不需要,但可能对具有更多 OpenMP 任务的代码)。
关于c++ - 有没有办法突破#omp parallel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55645990/
我是一名优秀的程序员,十分优秀!