gpt4 book ai didi

multithreading - 在已经多线程的应用程序中使用OpenMP(libgomp)

转载 作者:行者123 更新时间:2023-12-02 04:12:26 27 4
gpt4 key购买 nike

我们使用OpenMP(libgomp)来加快多线程Qt应用程序中的某些计算。并行OpenMP节位于两个不同的线程中,尽管实际上它们从未并行执行。在这种情况下,我们观察到的是启动了2N(其中N = OMP_THREAD_LIMIT)个omp线程,显然彼此干扰。计算时间非常长,而处理器负载却很低。设置OMP_WAIT_POLICY几乎没有任何效果。

我们还尝试将所有omp节移动到单个线程中(但是,从体系结构的角度来看,这对我们来说不是一个好的解决方案)。在这种情况下,仅在OMP_WAIT_POLICY设置为ACTIVE的情况下,总的计算时间确实减少了,并且处理器已满载。当为OMP_WAIT_POLICY == PASSIVE时,计算时间仍然很短,并且处理器处于50%的空闲时间。

奇怪的是,当我们在单个线程中使用omp时,使用omp并行化的第一个循环(在一系列omp计算中)执行速度比多线程情况慢10倍。

更新:我们的问题是:

a)在不同线程的上下文中使用omp时,有什么方法可以重用openmp线程。

b)为什么用OMP_WAIT_POLICY == PASSIVE执行会减慢一切。唤醒线程是否需要这么长时间?

c)对于第一个并行块如此缓慢的现象(即使在 Activity 模式下等待),是否有任何逻辑上的解释?

Upd2:请注意,该问题可能与GNU OMP实现有关。 icc没有。

最佳答案

尝试使用omp_set_num_threads(1)omp_set_num_threads(cpucount)在运行时启动/停止openmp线程

使用(1)进行的调用应停止所有openmp工作线程,而使用(cpu_num)进行的调用将再次重新启动它们。

因此,在编程开始时,运行omp_set_num_threads(1)
在omp并行化区域之前,即使使用WAIT_POLICY=active,您也可以启动omp线程,并且在此之前它们不会消耗cpu。

在omp并行区域之后,您可以再次停止线程。
omp_set_num_threads(cpucount)调用非常慢,比用wait_policy = passive唤醒线程要慢。这可能是(c)的原因-如果您的libgomp仅在第一个并行区域启动线程。

关于multithreading - 在已经多线程的应用程序中使用OpenMP(libgomp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4388870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com