我目前正在参加高效编程超级计算机和多核处理器的课程。我们最近的任务是测量MPI_Send命令的延迟(因此发送零字节消息所花费的时间)。现在仅此一点并不难,但我们必须对以下标准进行测量:
我想知道:我如何确定这一点?对于不同节点上的进程,我考虑过散列MPI_Get_processor_name返回的名称,该名称返回进程当前运行的节点的标识符,并将其作为标记发送。我也尝试使用sched_cpu()获取核心ID,但似乎这会返回一个增量数字,即使核心是超线程的(因此一个进程将在同一个核心上运行)。我该怎么做? 我只需要一个确定地方的概念!不是所述问题的完整代码。谢谢!
答案 0 :(得分: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_allowed
或Cpus_allowed_list
。在Windows上,GetProcessAffinityMask()
返回活动的亲和力掩码。
您还可以要求英特尔MPI通过将I_MPI_DEBUG
设置为4来报告最终固定,但除了固定信息之外,它还会产生许多其他输出。寻找类似于以下内容的行:
[0] MPI startup(): 0 1234 node100 {0}
[0] MPI startup(): 1 1235 node100 {1}