0

假设我有两个功能:

Fun1();
Fun2();

这些函数是独立的,如果我可以并行运行它们(即Fun1在一个线程和Fun2另一个线程上运行),任务将会得到改进。我使用的是 Visual Studio 2012 - 所以Open MP 2.0

有没有一种直接的方法(没有任何并行区域线程数测试或循环狡猾)来实现这一目标?OpenMP 是否提供这种功能?

我尝试将parallelandtask指令作为一个开始的地方,但我发现大多数文献完全难以理解并且找不到任何示例......

4

3 回答 3

5

C++11:

std::thread thread1(Fun1);
Fun2(); // runs on main thread
thread1.join(); // wait for completion

如果您没有 C++11,则可以替换std::threadboost::thread并执行相同操作。

于 2013-10-07T12:22:36.540 回答
4

您可以使用sections工作共享结构:

#pragma omp parallel sections
{
#pragma omp section
  Fun1();
#pragma omp section
  Fun2();
}

引用OpenMP 2.0 规范(第 2.4.2 节):

section 指令标识了一个非迭代工作共享结构,该结构指定了一组要在团队中的线程之间划分的结构。每个部分由团队中的一个线程执行一次。

于 2013-10-07T18:06:50.263 回答
0

是的,为什么不使用本机线程或围绕它们的一些包装器?据我所知,Open MP 比简单的线程运行工具强大得多。当然,您可以将某些标志变量标记为共享或私有,并在并行编译指示中检查它,或者使用 schedule 指令获得适当的结果(不要完全记住所有 OMP 功能),但是......

  • 你只有几个任务
  • 这不是真正的并行计算,也不是某种原始线程池,与在 2 个单线程中获取 GUI 和计算的问题相同
  • 你还没有告诉任何关于同步或复杂线程协作的事情

看起来你真的不需要 Open MP。

于 2013-10-07T12:34:26.763 回答