2012-02-12 150 views
7

我有一個程序嚴重縮小到多個線程,但理論上它應該線性縮放:它是一種計算,可以分成更小的塊,不需要系統調用,庫調用,鎖定,等等。使用四個線程運行的速度只有使用單線程(在四核系統上)運行速度的兩倍左右,而我期望的數字更接近四倍。多線程性能和性能測試

帶pthreads,C++ 0x線程和OpenMP的實現的運行時間同意。

爲了查明原因,我嘗試了gprof(無用)和valgrind(我沒有看到任何明顯的東西)。如何有效衡量導致經濟放緩的因素?關於其可能原因的任何通用想法?

- 更新 -

計算包括蒙特卡羅積分我注意到,不合理的時間量花在生成隨機數。雖然我不知道爲什麼會發生這種情況,但我注意到隨機數發生器不可重入。使用互斥鎖時,運行時間會爆炸。在檢查其他問題之前,我會重新實現這個部分。

我確實重新實現了確實提高性能的抽樣類。其餘的問題實際上是CPU緩存的爭用(由Evgeny懷疑,它被cachegrind透露)。

回答

4

您可以使用oprofile。或者是一個窮人的僞分析器:在gdb下運行該程序,停止它並查看它停止的位置。 「valgrind --tool = cachegrind」會告訴你CPU緩存的使用效率。

蒙特卡洛積分似乎是非常耗費內存的算法。嘗試估計,如何使用內存帶寬。這可能是您程序性能的限制因素。另外,如果你的系統只有2核超線程,那麼與4線程相比,它應該不會更快,與2線程相比。