[英]Why is my OpenMP implementation slower than a single threaded implementation? (Followup)
[英]Why is my OpenMP implementation slower than a single threaded implementation?
我正在学习OpenMP并发性,并尝试了我现有的一些代码。 在这段代码中,我尝试将所有for循环并行化。 但是,这似乎使程序更慢,比单线程版本慢10倍甚至更多。
这是代码: http : //pastebin.com/zyLzuWU2
我也使用了pthreads,结果比单线程版本更快。
现在的问题是,在我的OpenMP实现中我做错了什么导致了这种放缓?
谢谢!
编辑:单线程版本只是没有所有#pragmas的版本
我在您的代码中看到的一个问题是,您在非常小的循环(例如,8或64次迭代)中使用OpenMP。 由于开销,这将无效。 如果要将OpenMP用于n-queens问题,请查看OpenMP 3.0任务和线程并行性以解决分支绑定问题。
我认为您的代码太复杂了,无法在此处进行审核。 我立即看到的一个错误是它甚至不正确。 在使用omp parallel for
执行求和的地方,必须使用reduction(+: yourcountervariable)
将不同线程的结果正确组合在一起。 否则,一个线程可能会覆盖其他线程的结果。
至少有两个原因:
你只做了一个非常简单的循环的8次迭代。 您的运行时将完全由设置所有线程所涉及的开销所主导。
在某些地方, critical
部分会引起争议; 所有线程都将尝试连续访问临界区,并相互阻塞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.