我正在考虑一个线程池将执行代码块的设计,它可能包含OpenMP语句(主要是并行)。 (类似于:How to deal with OpenMP thread pool contention我猜)。 我的问题是,如果OpenMP并行区域每次都由不同的线程执行,它会导致问题或导致性能不佳。在线程池中执行的OpenMP代码
编辑:
目标将是Linux操作系统(GCC)和Windows(MSVC)。
当我的第一个原型完成时(这将受到我在这里得到的答案的影响),我会对它进行基准测试。
下面是一个简单的例子:
class Task
{
public:
void doTask()
{
#pragma omp parallel
{
// do work in parallel
}
}
};
现在想象你创建的Task
一个实例给它一个线程池(线程0,...,螺纹-N)。一个线程执行doTask()
。之后,您再次将相同的Task对象放入线程池,并再次......。 所以doTask()
(和平行部分)将由不同的线程执行。我想知道这是否由OpenMP有效地处理(例如,该部分的线程不会每次都重新创建)。
关于什么编译器? – 2011-01-28 15:58:20
根据我的经验优化代码,有一种方法可以知道某件事是否会提高性能:进行基准测试。如果实施过于复杂,思考和创建假设只有在某些事情很慢时才有用。创建一个真实的测试演示并进行基准测试 – 2011-01-28 16:36:33