我们使用OpenMP(libgomp)来加速多线程Qt应用程序中的一些计算。并行OpenMP部分位于两个不同的线程中,但实际上它们并不会并行执行。我们在这种情况下观察到的是2N(其中N = OMP_THREAD_LIMIT
)omp线程启动,显然互相干扰。计算时间非常长,而处理器负载很低。设置OMP_WAIT_POLICY
几乎没有任何影响。在已经多线程的应用程序中使用OpenMP(libgomp)
我们也尝试将所有omp节移到单个线程中(但从架构的角度来看,这不是一个好的解决方案)。在这种情况下,整体计算时间确实会下降并且处理器已满载,但前提是OMP_WAIT_POLICY
设置为ACTIVE
。当OMP_WAIT_POLICY == PASSIVE
时,计算时间保持较低,处理器空闲50%的时间。
奇怪的是,当我们在单线程中使用omp时,与多线程情况相比,使用omp(在一系列omp计算中)并行化的第一个循环执行速度要慢10倍。
UPD:我们的问题是:
一)有没有办法在不同的线程的上下文中使用OMP时,重用OpenMP的线程。
b)为什么使用OMP_WAIT_POLICY == PASSIVE
执行会减慢一切。唤醒线程需要很长时间吗?
c)是那里的第1并联块的速度比较慢(即使在主动模式下等待时)
UPD2的现象,任何合乎逻辑的解释:请注意该问题可能与GNU OMP实施。 icc没有它。
而你的问题是? – 2010-12-08 15:00:26
对不起,我更新了 – 2010-12-08 15:09:24