2011-12-29 18 views
3

因此,我刚刚购置了一台配备AMD 6212处理器的新型16核服务器。我有我在各种英特尔处理器上运行的代码。它使用锁定的队列将工作分配给pthread,pthread随后将工作写回共享内存,锁定写入。我主要是计算边界。AMD处理器上的几个pthreads没有收益?

在Intel处理器上,随着线程数的增加,我的性能立即提高。从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 

回答

0

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

没有深入研究体系结构问题,似乎分配的内存可能已经交错,因此不同的线程共享相同的内存,从而破坏了并行性能。

+0

为了进一步跟进,剩下的问题是由于访问全局变量引起的,这些变量并没有减慢英特尔方面的速度,但有一个巨大的对AMD方面造成负面影响。切换到Ubuntu似乎也有帮助。 – 2012-09-21 22:40:21

1

我的第一个猜测是,Linux调度没有把你的线程上的独立内核。

Linux调度程序尝试很难将任务保留在它们上次使用的CPU上,以便缓存具有包含相关和有用数据或指令的最佳机会。事实上,我发现它没有重新平衡。 (我知道,我甚至看到了声称可以重新平衡的代码,但是我发现CPU密集型工作负载都在同一个同级系统上运行,而没有移动到另一个核心。)

您的代码使用taskset(1),sched_setaffinity(2)cpuset(7)机制到手动将计算密集型任务分散到所有处理器?如果没有,我建议首先手动尝试taskset(1)以查看您的吞吐量是否有所提高,并且如果看到您期望的改进,则包括调用sched_setaffinity(2)程序。

+0

所以,这很奇怪。当我使用4个线程运行时,我看不到加速,但在'top'中使用率高达400%。当我使用'taskset 0x3 ./myprogram -threads 4'这样的东西时,我看到了1.5倍的加速。 – 2011-12-29 05:45:23

+0

调度程序可能会在每次执行时选择不同的核心;一旦程序正在运行,使用'taskset -p -c 0','taskset -p -c 1','taskset -p -c 2'等来强制每个线程到不同的核心。 – sarnold 2011-12-29 05:47:53

+0

只需将处理器强制加载到两个内核上,即可提供1.2倍的加速比与1.5倍的加速比。 – 2011-12-29 06:14:43

相关问题