2014-04-30 135 views
1

我已经编写了一个代码,该代码使用OpenMP进行了多个并行化循环。当执行此代码的单个实例时,运行时间非常低。但是,当我并行执行代码的多个实例时,每个实例的运行时间比预期的要高。OpenMP性能分析

使用缩放,我分析了一个实例(当70个并行运行时),并且该配置文件显示OpenMP消耗了65%的时间(请参见下图)。这可能是正确的吗?

enter image description here

回答

1

看起来你已经oversubscribed机器。因此,OpenMP运行时开始在等待线程数为preempted的自旋循环中浪费时间。即使自旋循环感知到超额预订(即周期性地调用sched_yield()),它仍然会浪费时间频繁切换上下文和其他开销。

+0

您能否告诉我可能的解决方案是什么?我如何看待上下文切换的花费? – user1274878

+0

只有一个解决方案 - 只是不要创建太多的线程和很多进程。如果需要,提出单独的问题 - 如何实现你试图达到的目标或可能谷歌帮助你 - 我给你的关键字 – Anton

+0

@ user1274878,说实话,你不明白你究竟想问什么。你是否问为什么70多线程程序超额订阅机器?或者你如何运行70个进程并且不会超额订阅这台机器?你能解释一下你想达到什么吗?为什么你真的需要同时运行大量的多线程进程? – Alex