因此,我刚刚获得了一台带有AMD 6212处理器的新型16核服务器。我也有在多种英特尔处理器上运行的代码。它使用锁定的队列将工作分配给pthread,然后pthread将工作写回到共享内存中,同时写操作也处于锁定状态。我主要是计算界。
在英特尔处理器上,随着线程数量的增加,性能会立即提高。从1线程到2线程几乎使性能提高了一倍。
在AMD处理器上使用相同的代码,即使有4个线程,我也丝毫没有收获(稍微慢一点)。但是,当我使用128个线程时,我看到了6倍的加速。
有谁知道可能会发生什么?
至于操作系统规范,如果输入:
cat /proc/version
我得到:
Linux version 2.6.32-5-amd64 (Debian 2.6.32-39) ([email protected]) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Thu Nov 3 03:41:26 UTC 2011
最佳答案
我的第一个猜测是Linux调度程序没有将您的线程放在单独的内核上。
Linux调度程序会尽力将任务保留在上次使用的CPU上,以使高速缓存最有可能包含相关且有用的数据或指令。我发现它实际上并不会重新平衡。 (我知道,我什至看到过声称进行重新平衡的代码,但是我发现CPU密集型工作负载以前都在同一个同级上运行,而从未移至另一个内核。)
您的代码是否使用taskset(1)
,sched_setaffinity(2)
或cpuset(7)
机制将计算密集型任务手动分布到所有处理器?如果没有,我建议您先手动尝试taskset(1)
来查看吞吐量是否有所提高,如果看到预期的改进,请在程序中包含sched_setaffinity(2)
调用。
关于multithreading - 从AMD处理器上的几个pthread中没有 yield 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8664313/