所以,我刚买了一台配备AMD 6212处理器的新型16核服务器。我有代码,我也在各种英特尔处理器上运行。它使用锁定队列将工作分配给pthreads,然后pthreads将工作写回到共享内存中,同时锁定写入。我主要是计算机绑定。
在英特尔处理器上,当我增加线程数时,我的性能会立即提高。从1到2线程几乎使性能翻倍。
在AMD处理器上使用相同的代码,即使是4个线程也没有获得任何收益(略微减速)。但是,当我使用128个线程时,我看到了6倍的加速。
有没有人知道可能会发生什么?
至于OS规格,如果我输入:
cat /proc/version
我明白了:
Linux version 2.6.32-5-amd64 (Debian 2.6.32-39) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Thu Nov 3 03:41:26 UTC 2011
答案 0 :(得分:1)
我的第一个猜测是Linux调度程序没有将你的线程放在不同的核心上。
Linux调度程序尝试非常难以将任务保留在他们上次使用的CPU上,以便缓存最有可能包含相关且有用的数据或指令。事实上,我发现它并没有重新平衡。 (我知道,我甚至看到了声称要进行重新平衡的代码,但我发现CPU密集型工作负载都在同一个兄弟上运行,而没有转移到另一个核心。)
您的代码是否使用taskset(1)
,sched_setaffinity(2)
或cpuset(7)
机制手动将计算密集型任务分散到所有处理器?如果没有,我建议先手动尝试taskset(1)
,看看您的吞吐量是否有所改善,并且如果您看到预期的改进,请在计划中加入sched_setaffinity(2)
次。
答案 1 :(得分:0)
所以,这还没有100%解决,但似乎问题与内存访问有关。代码在大多数运行期间没有动态内存分配,但是线程在启动时在堆上分配了大约100个小块内存。在程序的小样本版本中,我能够通过为堆栈中的每个线程而不是堆分配内存来消除瓶颈。
如果不深入研究架构问题,似乎已分配的内存可能已交错,以便不同的线程共享相同的内存,从而破坏并行性能。