Openamp Parallel Novite
OpenMP parallel nowait
OpenMP 有没有办法移除 parallel
块上的屏障?
我知道 nowait
可以在 parallel
中的 for
或 sections
块中使用,以允许线程向前移动而不必等待所有他们中的一个来完成相关的块。但是,#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。
OpenMP 有没有办法移除 parallel
块上的屏障?
我知道 nowait
可以在 parallel
中的 for
或 sections
块中使用,以允许线程向前移动而不必等待所有他们中的一个来完成相关的块。但是,#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。