【发布时间】:2017-11-08 22:53:19
【问题描述】:
假设我有一个程序,其函数名为run(),该函数将执行for loop 并在其中做一些工作。
因为我想利用我所有的 CPU 内核,我使用 OpenMP 和 #pragma omp parallel for 来并行化它。
现在,问题是这个run()函数是从多个线程调用的,当有大量线程同时调用run()时,我会有巨大的性能损失,因为会有很多OpenMP threads 来自每个 parallel for pragma 调用。
为了说明,我有线程 A 和线程 B,我的 CPU 有 4 个内核,线程 A 调用函数 run(),它将创建 4 个 OpenMP 线程来运行 for loop。
现在,同时线程B也调用了run(),这样会产生更多的4个OpenMP线程,总共有8个OpenMP线程。
我的问题是,是否有某种方法可以平衡 OpenMP,在上面的示例中,OpenMP 可以对 A 使用半线程,而对于 B 使用一半线程。
另一种策略是 OpenMP 创建一个线程队列,因此它永远不会使用超过 4 个 OpenMP 线程。
这样的事情可能吗?
PS。请注意,我的示例中的 2 个线程只是为了说明这一点,在我的程序中,不清楚有多少线程将调用 run(),因为线程数是在运行时根据需要创建的。
PS 2. 请注意,每当我谈论 OpenMP 创建的线程时,我将其称为 OpenMP 线程,而当我谈论通过其他方式创建的线程(例如 std::thread)时,我将其称为它只是线程。
【问题讨论】:
标签: c++ multithreading openmp