Openmp没有加速并行循环

时间:2012-11-25 18:20:45

标签: c multithreading for-loop parallel-processing openmp

我有以下令人难以置信的并行循环

//#pragma omp parallel for
for(i=0; i<tot; i++)
    pointer[i] = val;

为什么取消注释#pragma行导致性能下降?当我使用openmp并行化这个for循环时,我的程序运行时间略有增加。由于每次访问都是独立的,不应该大大提高程序的速度吗?

如果for循环没有针对较大的tot值运行,那么开销是否会降低速度?

1 个答案:

答案 0 :(得分:4)

在共享内存环境中使用多个线程实现性能通常取决于:

1) The task granularity;
2) Load balance between parallel tasks;
3) The number of parallel task/number of cores used;
4) The amount of synchronization among parallel tasks;
5) The type of bound of the algorithm.
6) The machine architecture;  

1)您需要检查granularity task是否足以克服线程creationsynchronization的开销。也许你的 tot 和计算指针[i] = val ;是不足以证明线程创建的合理性;值得注意的是high granularity也可能是一个问题,因为它可能导致Load Balance problems

2)您必须测试负载平衡(每个线程的工作量)。理想情况下,每个线程应该具有相同的工作量。在您的代码示例中,这不成问题;

3)你在使用超线程吗?!你使用的线程多于核心吗?!因为,如果你是,线程将开始“竞争”资源,这可能会导致性能下降;

4)通常,您希望减少线程之间的同步量,甚至可以使用数据冗余(以及其他方法)来实现这一点。这也不是您的代码问题。

5)首先,在使算法并行之前,你需要检查内存是否绑定,CPU绑定等等......如果是memory bound,你可以先从提高缓存使用率开始考虑并行化它。对于此任务,强烈建议使用分析器。

6)例如,在SMP架构中使用多线程方法与在NUMA架构上使用不同。因为在后者中你必须考虑内存亲和力

编辑:来自@Hristo lliev的建议

“将线程绑定到核心可以提高性能,甚至可以提高NUMA系统的性能,因为它可以改善数据的局部性。”

顺便说一下,我建议你阅读Intel Guide for Developing Multithreaded Applications.