【问题标题】:OpenMP: how to explicitly divide code into different threadsOpenMP:如何将代码显式划分为不同的线程
【发布时间】:2013-11-08 17:04:31
【问题描述】:

假设我有一个生成一些数据的Writer 类和一个使用它的Reader 类。我希望它们一直在不同的线程下运行。如何使用 OpenMP 做到这一点?

这是我想要的:

class Reader
{
public:
  void run();
};

class Writer
{
public:
  void run();
};

int main()
{
  Reader reader;
  Writer writer;

  reader.run(); // starts asynchronously
  writer.run(); // starts asynchronously

  wait_until_finished();
}

我猜第一个答案将指向将每个操作分成section,但sections 并不能保证将代码块分配给不同的线程。

tasks 可以吗?据我阅读task后的理解,每个代码块只执行一次,但分配的线程可以改变。

还有其他解决方案吗?

我想知道这一点,以了解我继承的使用 pthreads(显式创建多个线程)的代码是否可以使用 OpenMP 编写。问题是某些线程没有巧妙地编写并且包含活动的等待循环。在这种情况下,如果将两个处于活动等待状态的对象分配给同一个 OpenMP 线程(因此按顺序执行),它们可能会陷入死锁。至少,我认为sections 会发生这种情况,但我不确定tasks。

【问题讨论】:

    标签: c++ multithreading openmp


    【解决方案1】:

    序列化也可能发生在任务中。一个可怕的解决方案是自己重新实现sections,并保证每个部分都在单独的线程中运行:

    #pragma omp parallel num_threads(3)
    {
       switch (omp_get_thread_num())
       {
          case 0: wait_until_finished(); break;
          case 1: reader.run(); break;
          case 2: writer.run(); break;
       }
    }
    

    此代码假定您希望wait_until_finished()reader.run()writer.run() 并行执行。这是必要的,因为在 OpenMP 中,只有 parallel 构造的范围是程序并行执行的地方,因此无法将事物置于后台。

    【讨论】:

    • 这也是我能想到的唯一解决方案。这是否意味着 OpenMP 不提供我要求的机制?
    • @ChronoTrigger - 我不认为这就是 OpenMP 的用途。如果您只想要线程,请使用 pthreads。
    • @lichenbo,正如我的答案第二句的第二部分所写,sections 不保证这些部分将由不同的线程执行——这是 OP 特别想要的。跨度>
    • @HristoIliev 哦,谢谢,开始研究并行的东西 :-)
    【解决方案2】:

    如果您仍然要重写代码,最好转向线程构建块 (TBB;http://www.threadingbuildingblocks.org)。 TBB 明确支持流水线式操作(或更复杂的任务图),同时保持缓存局部性和底层线程数的独立性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多