问题

问题

问题

我如何运行两个基准测试以便:

  • 它们同时执行
  • 两个基准测试的每个插槽上都有一半的线程。
  • 没有两个线程共享同一个核心。

背景

我有两个程序:一个用 Fortran 编写的基准和一个用 C 编写的基准。它们都实现了 OpenMP 库,并设置为。

我目前正在尝试将两个进程的线程分散到多个套接字上,同时防止任何两个线程必须共享同一个核心。OpenMP 允许使用OMP_PROC_BIND=spread环境变量将线程均匀分布在多个套接字上。但是,当同时执行两个程序时,我最终发现两个基准测试共享同一个核心。

我在一台拥有两台 12 核 Haswell-E CPU 的服务器上运行这些基准测试,并将基准测试设置为每台创建 12 个线程,因此不会缺少核心。我目前正在运行 CentOS 7.3.1611。

边注

我知道这是一个奇怪的配置,但它是性能分析所必需的。在此先向所有对此主题有贡献的人表示感谢。

答案1

首先:从 /proc/cpuinfo 获取你的 CPU 布局,它看起来像这样(这是在 2 插槽、6 核上,列表截断):

> cat /proc/cpuinfo |grep -P 'processor|physical id|core id'
processor : 0
physical id : 1
core id   : 0
processor : 1
physical id : 0
core id   : 0
processor : 2
physical id : 1
core id   : 1
processor : 3
physical id : 0
core id   : 1

physical-id 将是您的插座,请注意在我的情况下,core-id 在插座之间切换。

使用“schedtool”将 1 个组的亲和性设置为全部位于 1 个物理 ID 上。因此,在我的例子中,由于偶数和奇数位于不同的物理 CPU(插槽)上,因此我将使用:

schedtool -a 0,2,4,6,8,10 -e run_group1 &
schedtool -a 1,3,5,7,9,11 -e run_group2 &

其中 run_group1 在 1 个核心上启动您想要的所有线程,而 run_group2 启动其他线程。(查看“man schedtool”(第 8 节中的更多选项。我将它们都放在后台,因此两个组应该同时运行。

您可能需要以 root 身份来设置亲和力——不确定。

这解决了您的问题吗?或者我误解了什么?

相关内容