jk4*_*736 7 performance multithreading
我有一个程序可以很好地扩展到多个线程,虽然 - 从理论上讲 - 它应该线性扩展:它是一个分成较小块的计算,不需要系统调用,库调用,锁定等.运行四个线程只是关于比使用单个线程(在四核系统上)运行速度快两倍,而我希望数字的速度接近四倍.
使用pthreads,C++ 0x线程和OpenMP的实现的运行时间一致.
为了找出原因,我尝试了gprof(无用)和valgrind(我没有看到任何明显的东西).我怎样才能有效地对导致经济放缓的因素进行基准测试?关于其可能原因的任何一般性想法?
- 更新 -
计算涉及蒙特卡洛积分,我注意到花费了不合理的时间来生成随机数.虽然我不知道为什么四线程会发生这种情况,但我注意到随机数生成器不是可重入的.使用互斥锁时,运行时间会爆炸.在检查其他问题之前,我会重新实现这一部分.
我重新实现了抽样类,这确实大大提高了性能.事实上,剩下的问题是CPU缓存的争用(正如evgeny所怀疑的那样,它被cachegrind所揭示.)
您可以使用 oprofile。或者一个穷人的伪分析器:在 gdb 下运行程序,停止它并查看它在哪里停止。“valgrind --tool=cachegrind”将向您展示 CPU 缓存的使用效率。
蒙特卡罗积分似乎是非常占用内存的算法。尝试估计内存带宽的使用情况。它可能是程序性能的限制因素。此外,如果您的系统只有 2 核且具有超线程,那么与 2 线程相比,4 线程的运行速度不会更快。
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |