kri*_*hna 2 linux gcc operating-system mpi
我开发了MPI程序,它可以在分布式环境中的不同内核上执行矩阵乘法,并且可以通过获取节点的主机名来演示在不同节点上的执行。但是当我们在单节点上运行程序时,我可以获得核心ID,它演示了在多节点上的执行示例代码如下
#include"stdio.h"
#include"stdlib.h"
#include"mpi.h"
int main(int argc , char **argv)
{
int size,rank;
int a,b,c;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank==0)
{
for(i=0;i<size;i++)
{
printf("insert a and b");
scanf("%d",&b);
scanf("%d",&c);
MPI_Send(&b,1,MPI_INT,i+1,6,MPI_COMM_WORLD);
MPI_Send(&c,1,MPI_INT,i+1,6,MPI_COMM_WORLD);
}
}
if(rank!=0)
{
MPI_Recv(&b,1,MPI_INT,0,6,MPI_COMM_WORLD,&s);
MPI_Recv(&c,1,MPI_INT,0,6,MPI_COMM_WORLD,&s);
a=b*c;
printf("Mul = %d\n",a);
//Print name of core on which my process is running
}
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然可以获得当前执行代码的逻辑处理器的 ID,但这通常没有意义,除非您启用 MPI 进程绑定(也称为进程固定(用 Intel 的说法))。绑定(或固定)限制每个 MPI 进程的 CPU 关联集,即允许执行该进程的 CPU 集。如果关联集仅包括单个逻辑 CPU,则进程将仅在该逻辑 CPU 上执行。逻辑CPU通常对应于具有SMT/超线程的CPU上的硬件线程或对应于非SMT/非超线程CPU上的CPU内核。给定包含多个逻辑 CPU 的关联集,调度程序可以迁移进程,以保持该集中的 CPU 同等繁忙。默认关联集通常包括所有可用的逻辑CPU,即进程可以被调度在任何核心或硬件线程上执行。
仅当 MPI 进程绑定到位并且每个进程绑定到单个逻辑 CPU 时,实际查询操作系统以获取进程的位置才有意义。您必须查阅 MPI 实施手册以了解如何启用它。例如,使用 Open MPI,您可以执行以下操作:
mpiexec --bind-to-core --bycore -n 120 ...
Run Code Online (Sandbox Code Playgroud)
--bind-to-core告诉 Open MPI 将每个进程绑定到单个 CPU 核心,并--bycore告诉它在多插槽计算机上连续分配核心(即,首先在第一个插槽中分配所有核心,然后在第二个插槽中分配,依此类推)。 (英特尔称为固定I_MPI_PIN)通过将环境变量设置为 来启用1。进程放置策略由 的值控制I_MPI_PIN_DOMAIN。要实现与上面显示的 Open MPI 命令行相同的效果,可以使用 Intel MPI 执行以下操作:
mpiexec -n 120 -env I_MPI_PIN 1 -env I_MPI_PIN_DOMAIN "core:compact" ...
Run Code Online (Sandbox Code Playgroud)
要以独立于平台的方式获取进程的位置,您可以hwloc_get_last_cpu_location()使用hwloc库。它是作为 Open MPI 项目的一部分开发的,但可以用作独立库。它提供了一个抽象接口来查询系统拓扑并操纵进程和线程的关联性。hwloc支持 Linux、Windows 和许多其他操作系统。
| 归档时间: |
|
| 查看次数: |
6294 次 |
| 最近记录: |