0

我目前正在参加关于超级计算机和多核处理器高效编程的课程。我们最近的任务是测量 MPI_Send 命令的延迟(即发送零字节消息所花费的时间)。现在仅此一项并不难,但我们必须根据以下标准执行我们的测量:

  • 同一处理器中的进程通信,
  • 相同的节点但不同的处理器,
  • 以及不同节点上的进程。

我想知道:我如何确定这一点?对于不同节点上的进程,我考虑过对 MPI_Get_processor_name 返回的名称进行哈希处理,该名称返回进程当前正在运行的节点的标识符,并将其作为标签发送。我还尝试使用 sched_cpu() 来获取核心 ID,但似乎这会返回一个递增的数字,即使核心是超线程的(因此进程将在同一个核心上运行)。我该怎么做?我只需要一个确定地点的概念!不是所述问题的完整代码。谢谢!

4

1 回答 1

2

为了将两个 MPI 进程放置在同一套接字的不同核心上,您应该将以下选项传递给mpiexec

-genv I_MPI_PIN=1 -genv I_MPI_PIN_DOMAIN=core -genv I_MPI_PIN_ORDER=compact

为了让来自不同套接字的内核上的两个 MPI 进程,您应该使用:

-genv I_MPI_PIN=1 -genv I_MPI_PIN_DOMAIN=core -genv I_MPI_PIN_ORDER=scatter

为了将它们放在两台不同的机器上,您应该创建一个主机文件,该文件只为每个节点提供一个插槽或使用:

-perhost 1 -genv I_MPI_PIN=1 -genv I_MPI_PIN_DOMAIN=core

sched_getcpuaffinity()您可以通过调用和检查返回的关联掩码来检查Linux 上的实际固定/绑定。作为替代方案,您可以解析/proc/self/status并查找Cpus_allowedor Cpus_allowed_list。在 Windows 上,GetProcessAffinityMask()返回活动关联掩码。

您也可以通过设置为 4 来要求 Intel MPI 报告最终固定I_MPI_DEBUG,但除了固定信息之外,它还会产生许多其他输出。查找类似于以下内容的行:

[0] MPI startup(): 0       1234     node100  {0}
[0] MPI startup(): 1       1235     node100  {1}
于 2015-05-24T19:18:46.763 回答