2

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

处理器在 /proc/cpuinfo 中从 0 到 63 编号。据我了解,有 4 个 8 核物理处理器,总共 PHYSICAL CORES 为 32,每个处理器内核都启用了超线程,总共 LOGICAL 处理器为 64。

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

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

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

  4. 使用 OpenMPI 编译

OpenMPI 有两个运行时选项

-cpu-set 指定分配给作业的逻辑 cpu, -cpu-per-proc 指定每个进程使用的 cpu 数量。

如果使用 mpirun -np 16 -cpu-set 0-15 运行,它会只使用 8 个物理内核吗?
如果使用 mpirun -np 16 -cpu-set 0-31 -cpu-per-proc 2 运行,它将如何安排?

谢谢

杰瑞

4

3 回答 3

1

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

基本上当线程必须共享处理器资源时,它们会减慢速度。所以最优策略通常是最小化处理器资源共享量。这是 CPU 绑定进程的正确策略,这通常是操作系统假定它正在处理的。

于 2011-02-13T22:34:59.370 回答
0

我会冒险猜测调度程序将尝试将线程保持在同一物理内核上的一个进程中。因此,如果您有 16 个线程,它们将位于最少数量的物理内核上。原因是缓存局部性;可以认为来自同一进程的线程比来自不同进程的线程更有可能接触相同的内存。(例如,跨内核缓存行失效的成本很高,但同一内核中的逻辑处理器不会发生这种成本)。

于 2011-02-13T22:31:21.463 回答
0

正如您从其他两个答案中看到的那样,理想的调度策略取决于线程正在执行的活动。

处理完全不同数据的线程受益于更多的分离。这些线程最好安排在单独的 NUMA 域和物理内核中。

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

处理相同数据并经历大量管道停顿的线程受益于共享超线程内核。每个线程都可以运行直到它停止,此时另一个线程可以运行。没有停顿的线程只会受到超线程的伤害,应该在不同的内核上运行。

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

因此,使用简化的线程调度程序通常会更有效,如果需要,让程序指定自己的策略。这是线程亲和性设置。

于 2011-04-24T23:40:58.283 回答