我有几个类遭受缓存争用,并使用"new"运算符进行分配.我可以以某种方式确保"new"返回一个与缓存行对齐的地址吗?
我正在使用GCC(如果它不可能).
我有一个程序可以很好地扩展到多个线程,虽然 - 从理论上讲 - 它应该线性扩展:它是一个分成较小块的计算,不需要系统调用,库调用,锁定等.运行四个线程只是关于比使用单个线程(在四核系统上)运行速度快两倍,而我希望数字的速度接近四倍.
使用pthreads,C++ 0x线程和OpenMP的实现的运行时间一致.
为了找出原因,我尝试了gprof(无用)和valgrind(我没有看到任何明显的东西).我怎样才能有效地对导致经济放缓的因素进行基准测试?关于其可能原因的任何一般性想法?
- 更新 -
计算涉及蒙特卡洛积分,我注意到花费了不合理的时间来生成随机数.虽然我不知道为什么四线程会发生这种情况,但我注意到随机数生成器不是可重入的.使用互斥锁时,运行时间会爆炸.在检查其他问题之前,我会重新实现这一部分.
我重新实现了抽样类,这确实大大提高了性能.事实上,剩下的问题是CPU缓存的争用(正如evgeny所怀疑的那样,它被cachegrind所揭示.)
我需要一个__m128i变量的函数,其周期为2 ^ 128.它不需要单调增加(如计数器),但访问每个值一次.
我能想到的最简单的例子实际上是一个128位计数器,但我发现在SSE中很难实现.有没有更简单/更快的解决方案?