我有一个利用OpenMP的程序,可以在具有32个核心服务器的双CPU上获得极大的加速。我正在使用的输入参数不允许完全加载CPU。
今天,另一个程序100%加载了几个核心。当我启动我的程序时,即使CPU上的负载像往常一样很高(~2500%),它也非常慢。我删除了并行指令,并注意到了一些性能改进。
这可能是由于内存带宽有限吗?我怎样才能进一步调查问题并最终改进我的代码?
答案 0 :(得分:2)
内存访问不一定会降低性能。如果使用静态调度(通常是默认值),则将循环划分为分配给线程的块。 如果线程绑定到已经忙碌的核心,则会大大降低运行时性能。 如果您在不保证是资源的唯一用户的环境中运行,则可以通过动态调度获得更好的性能。
如果您未指定计划类型,请使用
运行程序OMP_SCHEDULE=dynamic ./my_program
看看它是否有帮助。