【发布时间】:2011-06-17 07:08:11
【问题描述】:
我正在考虑一种设计,即线程池将执行代码块,其中可能包含 OpenMP 语句(大多数情况下是并行的)。 (类似于:How to deal with OpenMP thread pool contention 我猜)。 我的问题是,如果 OpenMP 并行区域每次都由不同的线程执行,是否会导致问题或导致性能下降。
编辑:
目标将是 Linux (gcc) 和 Windows (msvc)。
当我的第一个原型完成后,我将对其进行基准测试(这将受到我在这里得到的答案的影响)。
这是一个简单的例子:
class Task
{
public:
void doTask()
{
#pragma omp parallel
{
// do work in parallel
}
}
};
现在假设您创建了一个Task 的实例,并将其提供给线程池(thread-0,...,thread-n)。一个线程执行doTask()。稍后,您再次将相同的 Task 对象放入线程池,然后再次...。
所以doTask()(和并行部分)将由不同的线程执行。我想知道 OpenMP 是否有效地处理了这件事(例如,不是每次都重新创建该部分的线程)。
【问题讨论】:
-
根据我优化代码的经验,有一个方法可以知道某件事是否会提高性能:对其进行基准测试。仅当实现过于复杂时,思考和创建假设是否缓慢才有用。创建一个真实的测试演示并对其进行基准测试。
标签: c++ multithreading threadpool openmp