2

假设我有一个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();
}

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

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

还有其他解决方案吗?

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

4

2 回答 2

2

序列化也可能发生在任务中。一个可怕的解决方案是自己重新实现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构造的范围是程序并行执行的地方,并且没有办法将事物放在后台,可以这么说。

于 2013-11-08T18:48:59.740 回答
0

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

于 2013-11-11T09:34:34.453 回答