Openamp Parallel Novite

OpenMP parallel nowait

OpenMP 有没有办法移除 parallel 块上的屏障?

我知道 nowait 可以在 parallel 中的 forsections 块中使用,以允许线程向前移动而不必等待所有他们中的一个来完成相关的块。但是,#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.

结束

有办法解决这个问题吗?我真正想做的是请求一个新线程在程序继续进行时进行连接,而不管线程做什么或需要多长时间才能完成(显然,线程不会触及主机使用的任何数据线程)。

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

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

#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。