2011-01-28 17 views
2

我试图更好地理解启用了超线程的多核处理器是如何工作的。假设我有一个可以使用MPI或OpenMP或MPI + OpenMP进行编译的应用程序。我想知道如何在CentOS 5.3机箱上安装四个Xeon X7560 @ 2.27GHz处理器,并且每个处理器内核都启用了超线程技术。如何将应用程序安排在启用了超线程的多核计算机上?

处理器在/ proc/cpuinfo中的编号从0到63。对于我的理解,有4个8核物理处理器,总物理核心都是32,每个处理器核心都有支持超线程,总逻辑处理器64

  1. 与MPICH2 编译多少物理如果我用mpirun -np 16运行核心将被使用?它是否在可用的16个物理内核或16个LOGICAL处理器(使用超线程的8个物理内核)之间分配?

  2. 使用OpenMP编译 如果我设置了OMP_NUM_THREADS = 16,将使用多少个物理内核?它会使用16个LOGICAL处理器吗?

  3. 使用MPICH2 + OpenMP编译 如果将OMP_NUM_THREADS设置为16并使用mpirun -np 16运行,将使用多少个物理内核?

  4. 编译时的openmpi

的openmpi有两种运行时选项

-cpu集指定分配给作业逻辑CPU, -cpu每PROC指定给CPU的数量用于每个过程。

如果使用mpirun -np 16 -cpu-set 0-15运行,是否只使用8个物理内核?
如果使用mpirun -np 16 -cpu-set 0-31 -cpu-per-proc 2运行,它将如何计划?

感谢

杰里

回答

0

我会大胆地猜测调度会尽量保持线程一个进程在同一个物理内核。所以如果你有十六个线程,它们将是最小数量的物理内核。其原因将是缓存局部性;可以认为来自同一进程的线程更可能触及相同的内存,而不是来自不同进程的线程。 (例如,跨核心缓存线无效的成本很高,但同一核心中的逻辑处理器不会发生这种成本)。

1

我希望任何明智的调度程序都喜欢在不同的物理处理器上运行线程(如果可能的话)。然后我希望它更喜欢不同的物理内核。最后,如果必须的话,它会开始在每个物理核心上使用超线程的第二个线程。

基本上,当线程必须共享处理器资源时,它们会减慢速度。所以最佳策略通常是尽量减少处理器资源共享的数量。这是CPU绑定进程的正确策略,这通常是OS假定它正在处理的内容。

0

从其他两个答案中可以看出,理想的调度策略取决于线程正在进行的活动。

处理完全不同数据的线程从更多的分离中受益。理想情况下,这些线程将安排在单独的NUMA域和物理内核中。

处理相同数据的线程将受益于缓存局部性,因此策略策略是将它们排列在一起以使它们共享缓存。

在共享一个超线程核心的情况下,处理相同数据并且体验大量流水线延迟的线程将受益。每个线程都可以运行,直到它停顿,此时另一个线程可以运行。没有停顿的线程只会受到超线程的伤害,应该运行在不同的内核上。

做出理想的调度决策依赖于大量的数据收集和大量的决策。 OS设计中的一个巨大危险是让线程调度太聪明。如果操作系统花费大量的处理器时间试图找到运行线程的理想位置,那么可能会浪费时间来运行线程。

所以经常使用简化的线程调度程序更为有效,如果需要,可以让程序指定自己的策略。这是线程关联设置。

相关问题