OpenMP是否有办法删除parallel
块上的障碍?
我知道nowait
可以在for
中的sections
或parallel
块中使用,以便允许线程继续前进而无需等待所有这些完成相关的块。但是,#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
。
有解决方法吗?我真正想做的是在程序继续时请求一个新线程来进行连接,无论线程做什么或完成所需的时间(显然,线程不会触及任何使用的数据)主线程。)
答案 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。