我有一段代码
void parallel_func()
{
#pragma omp parallel
{
#pragma omp for collapse(2) schedule(dynamic) nowait
for(i=0; i<N; i++) {
for(j=0;j<N;j++) {
if (i>j) continue; // hack to allow collapse here
//...
}
}
#pragma omp critical
{
//...
}
}
}
使用分析器,我注意到我的代码花费的大部分时间......等待OpenMP 加入障碍 ......任何想法为什么?或者如何确定原因?
〜
答案 0 :(得分:1)
omp parallel
在哪里?我假设parallel_func
位于omp parallel
部分内。
目前尚不清楚,因为您没有说明哪个连接障碍会造成巨大的开销。在您的代码中,omp for
确实有nowait
,这意味着没有隐含障碍。你有omp critical
。这实际上是一个关键部分,因此不会进行屏障操作。 (如果omp single
,则需要加入障碍,除非omp single nowait
。
因此,唯一可疑的加入障碍位置来自omp parallel
部分,该部分未在您的代码中显示。如果parallel_func
的末尾是omp parallel
部分的结尾,并且您的omp parallel
没有nowait
,那么联接障碍就是parallel_func
的末尾1}}。
最后,如何找出原因?这主要是因为工作量不平衡。每个线程的工作量可能偏差太大。这将使一些线程在隐式连接障碍上浪费时间。请确定工作量分配。