如何在支持超线程的多核计算机上安排应用程序?

时间:2011-01-28 18:58:46

标签: cpu multicore utilization

我正在努力更好地了解启用超线程的多核处理器的工作原理。假设我有一个可以使用MPI或OpenMP或MPI + OpenMP编译的应用程序。我想知道如何在具有四个Xeon X7560 @ 2.27GHz处理器的CentOS 5.3盒子上进行安排,并且每个处理器内核都启用了超线程。

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

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

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

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

  4. 使用OpenMPI编译

  5. OpenMPI有两个运行时选项

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

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

    谢谢

    杰里

3 个答案:

答案 0 :(得分:1)

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

基本上,当线程必须共享处理器资源时,它们会变慢。因此,最佳策略通常是最小化处理器资源共享量。这是CPU绑定进程的正确策略,通常是操作系统假设处理的内容。

答案 1 :(得分:0)

我猜测调度程序会尝试将线程保留在同一物理内核上的一个进程中。因此,如果你有16个线程,它们将是最少数量的物理内核。这样做的原因是缓存局部性;可以认为,与来自不同进程的线程相比,来自同一进程的线程更可能触及相同的内存。 (例如,跨核心的高速缓存行无效的成本很高,但同一核心中的逻辑处理器不会产生成本。)

答案 2 :(得分:0)

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

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

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

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

制定理想的调度决策依赖于大量数据收集和大量决策。 OS设计中的一个巨大危险是使线程调度过于聪明。如果操作系统花了很多处理器时间试图找到运行线程的理想位置,那么浪费时间就可以用它来运行线程。

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