OpenMP并行nowait

时间:2016-05-30 20:37:20

标签: c++ multithreading parallel-processing openmp

OpenMP是否有办法删除parallel块上的障碍?

我知道nowait可以在for中的sectionsparallel块中使用,以便允许线程继续前进而无需等待所有这些完成相关的块。但是,#pragma omp parallel nowait会生成编译器错误。

我正在开发一个带有UI的程序。我调用一个函数来加载UI,当发生这种情况时,我也希望与服务器联系以发送一些使用数据。

这些功能中的每一个都可以正常工作,但如果我不并行执行,则需要一段时间。如果服务器关闭,那么连接尝试可能需要几秒钟才能中止,然后只需加载UI也需要一秒钟,此时事情需要花费太长时间。首先加载UI然后进行连接会使UI看起来冻结。

所以我想做一些像

这样的事情
// this generates a compiler error
#pragma omp parallel num_threads(2) nowait
{
  if(omp_get_thread_num() == 0)
    LoadUI();
  else
    Connect();
}

这样,主线程(必须是加载UI的线程)将加载UI,然后继续前进,而不管任何连接问题。但是,由于parallel nowait是被禁止的,因此我理解,如果存在连接问题(由于加载的UI需要更长时间才能中止),程序仍会暂时挂起。结束parallel

有解决方法吗?我真正想做的是在程序继续时请求一个新线程来进行连接,无论线程做什么或完成所需的时间(显然,线程不会触及任何使用的数据)主线程。)

1 个答案:

答案 0 :(得分:2)

我不认为您尝试做的是与OpenMP fork-join模型兼容。我们的想法是,在每个并行区域中,您生成的线程在并行区域的末尾连接。好的,线程不是实际生成的,因为通常有一个线程池,但这是概念模型。

请注意,即使以下内容也会生成编译器错误:

#pragma omp parallel for nowait
for (i=0; i<10; i++) {
  ...
}

您可以做的是在for内部并行区域后避开障碍。例如:

#pragma omp parallel
{
    #pragma omp parallel for
    for (int i=0; i<2; i++) {
    }
    /* no wait here */
    #pragma omp for
    for (int i=0; i<2; i++) {
    }
}

要做你需要的,你可能不得不使用pthreads或线程库。

PS:您可以使用OpenMP部分而不是检查线程ID。