不同进程位置的 MPI 发送延迟
MPI Send latency for different process localities
我目前正在参加超级计算机和多核处理器高效编程课程。我们最近的任务是测量 MPI_Send 命令的延迟(因此发送零字节消息所花费的时间)。现在仅此一项并不难,但我们必须根据以下标准执行测量:
- 同一处理器中的进程通信,
- 相同的节点但不同的处理器,
- 以及不同节点上的进程。
我想知道:我如何确定这一点?对于不同节点上的进程,我考虑过对 MPI_Get_processor_name 返回的名称进行哈希处理,其中 returns 进程当前正在 运行 节点的标识符,并将其作为标签发送。我还尝试使用 sched_cpu() 来获取核心 ID,但看起来这个 returns 是一个递增的数字,即使核心是超线程的(因此进程会 运行同一个内核)。我该怎么做?
我只需要一个确定地方的概念!不是所述问题的完整代码。谢谢!
为了将两个 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 上的实际 pinning/binding。作为替代方案,您可以解析 /proc/self/status
并查找 Cpus_allowed
或 Cpus_allowed_list
。在 Windows、GetProcessAffinityMask()
returns 活动亲和掩码上。
您也可以通过将 I_MPI_DEBUG
设置为 4 来要求 Intel MPI 报告最终的固定,但是除了固定信息之外,它还会产生很多其他输出。查找类似于以下内容的行:
[0] MPI startup(): 0 1234 node100 {0}
[0] MPI startup(): 1 1235 node100 {1}
我目前正在参加超级计算机和多核处理器高效编程课程。我们最近的任务是测量 MPI_Send 命令的延迟(因此发送零字节消息所花费的时间)。现在仅此一项并不难,但我们必须根据以下标准执行测量:
- 同一处理器中的进程通信,
- 相同的节点但不同的处理器,
- 以及不同节点上的进程。
我想知道:我如何确定这一点?对于不同节点上的进程,我考虑过对 MPI_Get_processor_name 返回的名称进行哈希处理,其中 returns 进程当前正在 运行 节点的标识符,并将其作为标签发送。我还尝试使用 sched_cpu() 来获取核心 ID,但看起来这个 returns 是一个递增的数字,即使核心是超线程的(因此进程会 运行同一个内核)。我该怎么做? 我只需要一个确定地方的概念!不是所述问题的完整代码。谢谢!
为了将两个 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 上的实际 pinning/binding。作为替代方案,您可以解析 /proc/self/status
并查找 Cpus_allowed
或 Cpus_allowed_list
。在 Windows、GetProcessAffinityMask()
returns 活动亲和掩码上。
您也可以通过将 I_MPI_DEBUG
设置为 4 来要求 Intel MPI 报告最终的固定,但是除了固定信息之外,它还会产生很多其他输出。查找类似于以下内容的行:
[0] MPI startup(): 0 1234 node100 {0}
[0] MPI startup(): 1 1235 node100 {1}