OpenMP 是否有办法移除parallel
block 上的障碍?
我知道 nowait
可以在 parallel
中的 for
或 sections
block 中使用,以便允许线程继续前进,而不必等待所有线程完成相关 block 。但是,#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 fork 连接模型不兼容。这个想法是在每个并行区域中生成在并行区域末尾连接的线程。好吧,线程不是实际上产生的,因为通常有一个线程池,但这是概念模型。
请注意,即使是以下内容也会产生编译器错误:
#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。
关于c++ - OpenMP 并行等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533363/