在我的主要职能中,我设置了:
omp_set_num_threads(20);它告诉OpenMP使用20个线程(有40个线程可用)。
然后执行包含以下指令的代码:
#pragma omp parallel for shared(x,y,z)用于主for循环,并通过htop监视CPU使用情况(可能不是最好的方法,但仍然如此)。for循环必须执行50个“任务”,每个任务都需要相当长的时间。我通过htop观察到,在任务完成后,线程数会下降。具体来说,使用20个线程,我希望ed会看到2000%的cpu使用率,直到剩下不到20个任务之后,线程才会“释放”自己。然而,我看到的是第一个2000%,在n个任务完成之后,我看到了2000% - (n*100%)的性能。这样看来,当任务完成时,线程就会关闭,而不是选择新的任务。
这是意料之中的,还是听起来很奇怪?
发布于 2016-05-04 19:44:44
几乎所有现有OpenMP编译器的默认并行循环调度都是static,这意味着OpenMP运行时将尝试在线程之间平均划分迭代空间并执行静态工作分配。因为您有50个迭代和20个线程,所以工作不能被平分,就像20不除以50。因此,一半线程将执行三次迭代,而另一半将执行两次迭代。
在(组合的parallel) for结构的末尾有一个隐式屏障,其中较早完成的线程等待其余线程完成。根据OpenMP实现的不同,可以将屏障实现为繁忙等待循环、某些OS同步对象上的等待操作或两者的组合。在后两种情况下,遇到障碍的线程的CPU使用率将在进入可中断睡眠时立即降至零,或者最初在短时间内保持100% (繁忙循环),然后下降到零(等待)。
如果循环迭代所需的时间完全相同,那么最初的CPU使用率将为2000%,然后在两次迭代之后(如果屏障实现使用一个短的繁忙循环,则会稍微多一点)将降至1000%。如果每次迭代都需要不同的时间,那么线程就会到达不同的时刻,CPU的使用也会逐渐减少。
在任何情况下,都可以使用schedule(dynamic)将每个迭代交给第一个线程可用。当迭代需要不同的时间时,这将提高CPU的利用率。当每次迭代所花费的时间相同时,这将于事无补。在后一种情况下,解决方案是将迭代次数作为线程数的整数倍。
https://stackoverflow.com/questions/37014730
复制相似问题