MGeo地址匹配镜像评测:开箱即用,专为中文地址场景优化
2026/4/15 6:25:18
PMIx(Process Management Interface for Exascale)是一个为大规模并行计算(特别是 Exascale 级别)设计的标准化进程管理接口,旨在为作业调度器(如 Slurm、PBS、LSF)与运行时系统(如 MPI 实现、OpenSHMEM、任务调度器等)之间提供统一、可扩展、高效的通信机制。
PMIx 提供以下能力:
Slurm 从v17.11 开始内置支持 PMIx,并在v20.11+ 中默认启用 PMIx v3/v4。集成方式如下:
Slurm 的slurm.conf中需启用 PMIx 插件:
# slurm.conf LaunchParameters=pmix_v3或指定具体版本(如pmix_v4)。
Slurm 守护进程(slurmctld,slurmd)会在作业启动时自动与 PMIx 服务通信。
现代 MPI 实现(如 Open MPI ≥ v4.0、MPICH ≥ v4.0)默认通过 PMIx 获取作业信息,无需用户干预。
例如,使用 Slurm 提交一个 Open MPI 作业:
srun--mpi=pmix-n64./my_mpi_app--mpi=pmix:告诉 Slurm 使用 PMIx 作为 MPI 启动通道。libpmix与 Slurm 的pmd(PMIx daemon)通信,获取 rank 映射、网络信息等。注意:Open MPI 默认已编译 PMIx 支持;MPICH 需启用
--with-pmix编译。
以下是一个简单的 PMIx 程序,展示如何获取当前进程的 rank 和总进程数:
#include<pmix.h>#include<stdio.h>intmain(intargc,char*argv[]){pmix_proc_tmyproc;pmix_value_t*val;pmix_status_trc;// 初始化 PMIxif(PMIX_SUCCESS!=(rc=PMIx_Init(&myproc,NULL,0))){fprintf(stderr,"PMIx_Init failed: %d\n",rc);returnrc;}printf("My namespace: %s, rank: %d\n",myproc.nspace,myproc.rank);// 获取总进程数(Slurm 会通过 PMIx 注入此信息)pmix_proc_tproc;PMIX_PROC_CONSTRUCT(&proc);strncpy(proc.nspace,myproc.nspace,PMIX_MAX_NSLEN);proc.rank=PMIX_RANK_WILDCARD;if(PMIX_SUCCESS==PMIx_Get(&proc,PMIX_JOB_SIZE,NULL,0,&val)){printf("Total ranks: %lu\n",val->data.uint32);PMIX_VALUE_RELEASE(val);}// FinalizePMIx_Finalize(NULL,0);return0;}编译(需链接 PMIx):
gcc-opmix_demo pmix_demo.c$(pkg-config--cflags--libspmix)通过 Slurm 运行:
srun-n4./pmix_demo输出示例:
My namespace: slurm.job.12345, rank: 0 Total ranks: 4 My namespace: slurm.job.12345, rank: 1 Total ranks: 4 ...| 场景 | 说明 |
|---|---|
| MPI 启动优化 | 避免 SSH/树形启动开销,Slurm 直接 fork 进程并通过 PMIx 传递通信上下文。 |
| 异构任务调度 | 任务调度器(如 Flux、Taskflow)通过 PMIx 获取 Slurm 资源分配,动态创建子任务。 |
| 作业内服务发现 | 一个 rank 启动服务(如参数服务器),其他 rank 通过 PMIx KVS 发现其地址。 |
| 容错与事件通知 | 某进程崩溃,PMIx 通知其他进程,触发恢复逻辑。 |
PMIX_MCA_base_verbose=10环境变量查看 PMIx 日志。