【问题标题】:Break out of OpenMP Section & Tasks突破 OpenMP 部分和任务
【发布时间】:2019-04-02 19:45:51
【问题描述】:

我希望能够运行两个永远运行的线程(一个线程计算一些复杂的计算,另一个线程计算时间并产生超时)。一旦超时线程达到所需时间,我想停止两个线程。我尝试了几种方法:首先将第一个线程作为任务运行并退出线程,然后使用节(通过尝试运行 #pragma omp cancel sections)。 这是我目前所拥有的:

    #pragma omp parallel num_threads(8) shared(break_out)
        {
            while (!break_out){
                #pragma omp sections 
                {
                    #pragma omp section
                        complex_calc();

                    #pragma omp section
                    {
                        //Timekeeping
                        while(true){
                            current_time = std::chrono::high_resolution_clock::now();
                            wall_clock = std::chrono::duration_cast<std::chrono::duration<double>> (current_time - start_time);
                            if (wall_clock.count() > 0.99 * TIME_LIMIT){
                                break_out = true;
                                #pragma omp cancel sections
                                break;
                            }
                        }
                    }
                }
            }
        }
**Point X**

当超时发生时,代码能够跳出第二部分,但第一部分仍然运行。有没有办法在程序中返回到'Point X'?

【问题讨论】:

  • OpenMP 并不是真正适合这种手动线程管理的范例。您最终将绕过 OpenMP 自行执行大量线程管理/通信。另见stackoverflow.com/q/43496870/620382
  • 想了很多:/我会在您发送的链接中尝试您的建议。

标签: c++ multithreading openmp


【解决方案1】:

第二个sections 构造中的cancel 构造将正确终止第二个sections 构造。但它不会影响第一个,除非您在第一个 sections 构造中添加 cancellation point 构造。

OpenMP 始终需要结合使用 cancel 构造来触发 OpenMP 区域的取消,并在其他线程/任务中使用 cancellation point 构造来做出反应并取消它们的区域。

【讨论】:

  • 问题是,一旦您必须手动插入取消点,与仅检查计算线程中的时间相比,使用看门狗线程和取消几乎没有什么好处。
  • 是的,@Zulan 是对的。我有第二部分的原因是在另一部分运行时异步计数。如果我在另一个线程中检查超时,那将是不准确的:该函数可能在超时之前运行,但在超时之后完成,因为检查是在函数之前完成的。
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
相关资源
最近更新 更多