为什么我的OpenMP实现比单线程实现慢?

时间:2011-02-18 14:17:55

标签: c openmp

我正在学习OpenMP并发性,并尝试了我现有的一些代码。在这段代码中,我尝试将所有for循环并行化。但是,这似乎使程序变得更慢,速度比单线程版本慢10倍甚至更多。

以下是代码:http://pastebin.com/zyLzuWU2

我还使用了pthreads,结果证明它比单线程版本更快。

现在的问题是,我的OpenMP实施中我做错了什么导致了这种放缓?

谢谢!

编辑:单线程版本只是没有所有#pragmas

的版本

3 个答案:

答案 0 :(得分:4)

我在您的代码中看到的一个问题是您在非常小的循环(例如,8或64次迭代)中使用OpenMP。由于开销,这将无效。如果要将OpenMP用于n-queens问题,请查看OpenMP 3.0任务和线程并行性以解决分支绑定问题。

答案 1 :(得分:3)

我认为您的代码太复杂了,无法在此处进行审核。我立即看到的一个错误是它甚至不正确。在使用omp parallel for进行求和的地方,必须使用reduction(+: yourcountervariable)将不同线程的结果正确组合在一起。否则一个线程可能会覆盖其他线程的结果。

答案 2 :(得分:2)

至少有两个原因:

  1. 你只进行了一次非常简单的循环的8次迭代。您的运行时将完全由设置所有线程所涉及的开销控制。

  2. 在某些地方,critical部分会引起争用;所有线程都会尝试连续访问临界区,并相互阻塞。