AMD处理器的几个pthreads没有收获?

时间:2011-12-29 05:28:39

标签: multithreading pthreads

所以,我刚买了一台配备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

2 个答案:

答案 0 :(得分:1)

我的第一个猜测是Linux调度程序没有将你的线程放在不同的核心上。

Linux调度程序尝试非常难以将任务保留在他们上次使用的CPU上,以便缓存最有可能包含相关且有用的数据或指令。事实上,我发现它并没有重新平衡。 (我知道,我甚至看到了声称要进行重新平衡的代码,但我发现CPU密集型工作负载都在同一个兄弟上运行,而没有转移到另一个核心。)

您的代码是否使用taskset(1)sched_setaffinity(2)cpuset(7)机制手动将计算密集型任务分散到所有处理器?如果没有,我建议先手动尝试taskset(1),看看您的吞吐量是否有所改善,并且如果您看到预期的改进,请在计划中加入sched_setaffinity(2)次。

答案 1 :(得分:0)

所以,这还没有100%解决,但似乎问题与内存访问有关。代码在大多数运行期间没有动态内存分配,但是线程在启动时在堆上分配了大约100个小块内存。在程序的小样本版本中,我能够通过为堆栈中的每个线程而不是堆分配内存来消除瓶颈。

如果不深入研究架构问题,似乎已分配的内存可能已交错,以便不同的线程共享相同的内存,从而破坏并行性能。