MPI 用户指南
MPI 的使用取决于所使用的 MPI 类型。 这些不同的 MPI 实现有三种根本不同的操作模式。
- Slurm 直接启动任务并通过 PMI-1、PMI-2 或 PMIx API 执行通信初始化。 (大多数现代 MPI 实现支持此功能。)
- Slurm 为作业创建资源分配,然后使用 Slurm 的基础设施(srun)启动任务。
- Slurm 为作业创建资源分配,然后使用除 Slurm 以外的某种机制启动任务,例如 SSH 或 RSH。 这些任务在 Slurm 的监控或控制之外启动,并且需要从批处理节点访问节点(例如 SSH)。 Slurm 的 epilog 应配置为在作业的分配被放弃时清除这些任务。 强烈建议使用 pam_slurm_adopt。
注意:在情况 3 中,Slurm 并没有直接启动用户应用程序,这可能会阻止将任务绑定到 CPU 和/或计费,并且这不是推荐的方式。
两个 Slurm 参数控制支持哪个 PMI(进程管理接口)实现。适当的配置对于 Slurm 建立 MPI 作业的适当环境至关重要,例如设置适当的环境变量。 MpiDefault 配置参数在 slurm.conf 中建立系统的默认 PMI。 srun 选项 --mpi=(或等效的环境变量 SLURM_MPI_TYPE)可用于指定何时为单个作业使用不同的 PMI 实现。
可以在 mpi.conf 文件中设置参数,以允许您修改 PMI 插件的行为。
注意:使用没有适当 Slurm 插件的 MPI 实现可能导致应用程序失败。如果在系统上使用多个 MPI 实现,则某些用户可能需要明确指定合适的 Slurm MPI 插件。
注意:如果使用 RPM 安装 Slurm,则 slurm-libpmi 包将与已安装的 pmix-libpmi 包冲突。如果您所在站点的政策允许您从源代码安装,这将允许您将这些包安装到不同的位置,以便您可以选择使用哪些库。
注意:如果您使用 hwloc 构建任何 MPI 堆栈组件,请注意 hwloc 版本 2.5.0 到 2.7.0(包括)存在一个错误,该错误将一个不可触及的值推入 environ 数组,导致访问时发生段错误。 建议使用 hwloc 版本 2.7.1 或更高版本进行构建。
以下提供了使用多种 MPI/PMI 与 Slurm 的说明链接。
PMIx
构建 PMIx
在构建 PMIx 之前,建议阅读这些 使用指南。它们提供了一些关于 构建依赖项和安装步骤的详细信息,以及一些与 Slurm 支持 相关的说明。
本节旨在补充 PMIx FAQ,提供有关如何准备 Slurm 和 PMIx 协同工作的说明。PMIx 可以从官方 PMIx GitHub 仓库获取, 可以通过克隆仓库或下载打包版本。
Slurm 对 PMIx 的支持首次包含在基于 PMIx v1.2 发布的 Slurm 16.05 中。此后已更新以支持 PMIx 系列的最高版本 5.x,如下表所示:
- Slurm 20.11+ 支持 PMIx v1.2+、v2.x 和 v3.x。
- Slurm 22.05+ 支持 PMIx v2.x、v3.x、v4.x 和 v5.x。
构建支持 PMIx 的 Slurm
在配置时,Slurm 不会构建 PMIx,除非设置 --with-pmix。 然后它将默认查找以下位置的 PMIx 安装:
/usr /usr/local
如果 PMIx 没有安装在上述任何位置,可以请求 Slurm 配置脚本指向非默认位置。以下是一个示例,假设安装目录为 /home/user/pmix/v4.1.2/:
user@testbox:~/slurm/22.05/build$ ../src/configure \ > --prefix=/home/user/slurm/22.05/inst \ > --with-pmix=/home/user/pmix/4.1.2
或者使用基于 RPM 的构建的类似方法:
user@testbox:~/slurm_rpm$ rpmbuild \ > --define '_prefix /home/user/slurm/22.05/inst' \ > --define '_slurm_sysconfdir /home/user/slurm/22.05/inst/etc' \ > --define '_with_pmix --with-pmix=/home/user/pmix/4.1.2' \ > -ta slurm-22.05.2.1.tar.bz2
注意:也可以使用 ':' 分隔符构建多个 PMIx 版本。例如,要构建 3.2 和 4.1:
... > --with-pmix=/path/to/pmix/3.2.3:/path/to/pmix/4.1.2 \ ...
然后,在提交作业时,可以使用可用的 --mpi=list 选项选择所需的版本。PMIx 的默认值将是库的最高版本:
$ srun --mpi=list MPI 插件类型是... cray_shasta none pmi2 pmix 可用的特定 pmix 插件版本:pmix_v3,pmix_v4
继续配置,如果 Slurm 无法找到 PMIx 安装和/或找到但认为不可用,配置输出应记录如下内容:
checking for pmix installation... configure: WARNING: unable to locate pmix installation
检查 Slurm 构建目录中生成的 config.log 可能会提供更多详细信息以供故障排除。配置后, 我们可以继续安装 Slurm(根据需要使用 make 或 rpm):
user@testbox:~/slurm/22.05/build$ make -j install user@testbox:~/slurm/22.05/build$ cd /home/user/slurm/22.05/inst/lib/slurm/ user@testbox:~/slurm/22.05/inst/lib/slurm$ ls -l *pmix* lrwxrwxrwx 1 user user 16 jul 6 17:17 mpi_pmix.so -> ./mpi_pmix_v4.so -rw-r--r-- 1 user user 9387254 jul 6 17:17 mpi_pmix_v3.a -rwxr-xr-x 1 user user 1065 jul 6 17:17 mpi_pmix_v3.la -rwxr-xr-x 1 user user 1265840 jul 6 17:17 mpi_pmix_v3.so -rw-r--r-- 1 user user 9935358 jul 6 17:17 mpi_pmix_v4.a -rwxr-xr-x 1 user user 1059 jul 6 17:17 mpi_pmix_v4.la -rwxr-xr-x 1 user user 1286936 jul 6 17:17 mpi_pmix_v4.so
如果还需要支持 PMI-1 或 PMI-2 版本,也可以从 contribs 目录安装:
user@testbox:~/slurm/22.05/build/$ cd contribs/pmi1 user@testbox:~/slurm/22.05/build/contribs/pmi1$ make -j install user@testbox:~/slurm/22.05/build/$ cd contribs/pmi2 user@testbox:~/slurm/22.05/build/contribs/pmi2$ make -j install user@testbox:~/$ ls -l /home/user/slurm/22.05/inst/lib/*pmi* -rw-r--r-- 1 user user 493024 jul 6 17:27 libpmi2.a -rwxr-xr-x 1 user user 987 jul 6 17:27 libpmi2.la lrwxrwxrwx 1 user user 16 jul 6 17:27 libpmi2.so -> libpmi2.so.0.0.0 lrwxrwxrwx 1 user user 16 jul 6 17:27 libpmi2.so.0 -> libpmi2.so.0.0.0 -rwxr-xr-x 1 user user 219712 jul 6 17:27 libpmi2.so.0.0.0 -rw-r--r-- 1 user user 427768 jul 6 17:27 libpmi.a -rwxr-xr-x 1 user user 1039 jul 6 17:27 libpmi.la lrwxrwxrwx 1 user user 15 jul 6 17:27 libpmi.so -> libpmi.so.0.0.0 lrwxrwxrwx 1 user user 15 jul 6 17:27 libpmi.so.0 -> libpmi.so.0.0.0 -rwxr-xr-x 1 user user 241640 jul 6 17:27 libpmi.so.0.0.0
注意:由于 Slurm 和 PMIx 低于 4.x 都提供 libpmi[2].so 库,因此我们建议您将这两个软件安装在不同的位置。否则,这些相同的库可能最终会安装在标准位置,例如 /usr/lib64,包管理器会报告错误,报告冲突。
注意:任何编译时使用 PMIx 的应用程序都应使用与 Slurm 使用的相同 PMIx,或至少是具有相同安全域的 PMIx,否则可能会出现身份验证问题。例如,一个 PMIx 编译时使用 --with-munge,而另一个编译时使用 --without-munge(自 PMIx 4.2.4 起为默认值)。一个可能有效的解决方法是通过在命令行中添加 "--mca psec native" 或导出 PMIX_MCA_psec=native 环境变量来指定所需的安全方法。
注意:如果您使用多个 slurmd 设置测试环境,则需要在您的 slurm.conf 中指定 TmpFS 选项,并且创建的目录路径数量需要等于节点数量。这些目录由 Slurm PMIx 插件用于创建临时文件和/或 UNIX 套接字。 以下是两个名为 compute[1-2] 的节点的示例设置:
slurm.conf: TmpFS=/home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-%n $ mkdir /home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-compute1 $ mkdir /home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-compute2
测试 Slurm 和 PMIx
可以直接测试 Slurm 和 PMIx,而无需安装 MPI 实现。以下是一个示例,演示这两个组件正常工作:
$ srun --mpi=list MPI 插件类型是... cray_shasta none pmi2 pmix 可用的特定 pmix 插件版本:pmix_v3,pmix_v4 $ srun --mpi=pmix_v4 -n2 -N2 \ > /home/user/git/pmix/test/pmix_client -n 2 --job-fence -c ==141756== OK ==141774== OK
OpenMPI
当前版本的 Slurm 和 Open MPI 支持使用 srun 命令启动任务。
如果 OpenMPI 配置为 --with-pmi= 指向 Slurm 的 PMI-1 libpmi.so 或 PMI-2 libpmi2.so 库,则 OMPI 作业可以直接使用 srun 命令启动。这是首选的操作模式,因为 Slurm 提供的计费功能和亲和力将变得可用。如果启用了 pmi2 支持,则必须在 srun 命令行上指定选项 '--mpi=pmi2'。 另外,可以在 slurm.conf 中配置 'MpiDefault=pmi' 或 'MpiDefault=pmi2'。
从 Open MPI 版本 3.1 开始,原生支持 PMIx。要使用 PMIx 启动 Open MPI 应用程序,必须在 srun 命令行上指定 '--mpi=pmix' 选项,或者在 slurm.conf 中配置 'MpiDefault=pmix'。
也可以使用外部 PMIx 安装构建 OpenMPI。 有关详细程序,请参阅 OpenMPI 文档,但基本上是在配置 OpenMPI 时指定 --with-pmix=PATH。 请注意,如果使用外部 PMIx 安装构建 OpenMPI,则 OpenMPI 和 PMIx 需要针对相同的 libevent/hwloc 安装进行构建。 OpenMPI 配置脚本提供了选项 --with-libevent=PATH 和/或 --with-hwloc=PATH 以使 OpenMPI 与 PMIx 的构建匹配。
一组参数可用于控制 Slurm PMIx 插件的行为,详细信息请阅读 mpi.conf。
注意:OpenMPI 有一个限制,不支持在 Slurm 分配内调用 MPI_Comm_spawn()。如果您需要使用 MPI_Comm_spawn() 函数,则需要使用与 PMI-2 结合的其他 MPI 实现,因为 PMIx 也不支持它。
注意:某些内核和系统配置导致锁定内存太小,无法正常运行 OpenMPI,导致应用程序因段错误而失败。可以通过配置 slurmd 守护进程以更大的限制来解决此问题。例如,在您的 slurmd.service 文件中添加 "LimitMEMLOCK=infinity"。
Intel MPI
Intel® MPI 库用于 Linux 操作系统支持在 Slurm 作业管理器控制下启动 MPI 作业的以下方法:
此描述提供了这两种方法的详细信息。
通过 Hydra 进程管理器的 mpirun 命令
Slurm 默认通过 Intel® MPI 库的 mpirun 命令支持 Hydra 进程管理器。当在分配内启动时,mpirun 命令将自动读取 Slurm 设置的环境变量,例如节点、CPU、任务等,以在每个节点上启动所需的 Hydra 守护进程。这些守护进程将使用 srun 启动,并随后启动用户应用程序。由于 Intel® MPI 仅支持 PMI-1 和 PMI-2(不支持 PMIx),因此强烈建议将此 MPI 实现配置为使用 Slurm 的 PMI-2,它提供比 PMI-1 更好的可扩展性。 不推荐使用 PMI-1,应该尽快弃用。
以下是如何在使用 Slurm 的 PMI-2 库的独占 10 个节点分配中启动用户应用程序的示例:
$ salloc -N10 --exclusive $ export I_MPI_PMI_LIBRARY=/path/to/slurm/lib/libpmi2.so $ mpirun -np <num_procs> user_app.bin
请注意,默认情况下,Slurm 将注入两个环境变量,以确保 mpirun 或 mpiexec 将使用 Slurm 启动机制(srun)来启动 Hydra。 有了这些,Hydra 还将向 srun 传递参数 '--external-launcher',以便不将这些 Hydra 进程视为常规步骤。可以通过在 slurm.conf 中设置 "MpiParams=disable_slurm_hydra_bootstrap" 来禁用此自动变量注入机制,除非在 "slurm" 已明确设置为引导程序的情况下。
可以使用不同的引导机制运行 Intel MPI。为此,在使用 sbatch 或 salloc 提交作业之前,明确设置以下环境变量:
$ export I_MPI_HYDRA_BOOTSTRAP=ssh $ salloc -N10 $ mpirun -np <num_procs> user_app.bin
使用 srun 命令(Slurm,推荐)
此方法也得到了 Intel® MPI 库的支持。 此方法与 Slurm 集成最好,支持进程跟踪、计费、任务亲和力、挂起/恢复和其他功能。 与前一种情况一样,我们展示了如何在使用 Slurm 的 PMI-2 库的独占 10 个节点分配中启动用户应用程序的示例,允许其利用所有 Slurm 功能。这可以通过 sbatch 或 salloc 命令完成:
$ salloc -N10 --exclusive $ export I_MPI_PMI_LIBRARY=/path/to/slurm/lib/libpmi2.so $ srun user_app.bin
注意:我们手动指向 Slurm 的 PMI-1 或 PMI-2 库的原因是出于许可原因。IMPI 不直接链接到任何外部 PMI 实现,因此,与其他堆栈(OMPI、MPICH、MVAPICH...)不同,Intel 并不与 Slurm 库构建。指向此库将导致 Intel dlopen 并使用此 PMI 库。
注意:Intel 对 PMIx 库没有提供官方支持。由于 IMPI 基于 MPICH,使用 PMIx 与 Intel 可能有效,因为 PMIx 与 pmi2(在 MPICH 中使用的库)保持兼容,但不能保证在所有情况下都能运行,PMIx 可能会在未来版本中破坏这种兼容性。
有关更多信息,请参见: Intel MPI 库 。
MPICH
MPICH 以前称为 MPICH2。
MPICH 作业可以使用 srun 或 mpiexec 启动。 这两种操作模式如下所述。MPICH 实现支持 PMI-1、PMI-2 和 PMIx(从 MPICH v4 开始)。
请注意,默认情况下,Slurm 将注入两个环境变量,以确保 mpirun 或 mpiexec 将使用 Slurm 启动机制(srun)来启动 Hydra。 有了这些,Hydra 还将向 srun 传递参数 '--external-launcher',以便不将这些 Hydra 进程视为常规步骤。可以通过在 slurm.conf 中设置 "MpiParams=disable_slurm_hydra_bootstrap" 来禁用此自动变量注入机制,除非在 "slurm" 已明确设置为引导程序的情况下。
可以使用不同的引导机制运行 MPICH。为此,在使用 sbatch 或 salloc 提交作业之前,明确设置以下环境变量:
$ export HYDRA_BOOTSTRAP=ssh $ salloc -N10 $ mpirun -np <num_procs> user_app.bin
使用 srun 和链接 Slurm 的 PMI-1 或 PMI-2 库的 MPICH
MPICH 可以专门为与 Slurm 及其 PMI-1 或 PMI-2 库一起使用而构建,使用类似于下面所示的配置行。以这种方式构建将强制在每次执行时使用此库。请注意,LD_LIBRARY_PATH 可能不是必需的,具体取决于您的 Slurm 安装路径:
对于 PMI-2:
user@testbox:~/mpich-4.0.2/build$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ \ > ../configure --prefix=/home/user/bin/mpich/ --with-pmilib=slurm \ > --with-pmi=pmi2 --with-slurm=/home/lipi/slurm/master/inst
或对于 PMI-1:
user@testbox:~/mpich-4.0.2/build$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ \ > ../configure --prefix=/home/user/bin/mpich/ --with-pmilib=slurm \ > --with-slurm=/home/user/slurm/22.05/inst
这些配置行将检测 Slurm 安装的 PMI 库并链接到它们,但 不会安装 mpiexec 命令。由于 PMI-1 已经过时且扩展性差,我们不建议您链接到它。 最好使用 PMI-2。您可以按照此示例使用 PMI-2 运行作业:
$ mpicc -o hello_world hello_world.c $ srun --mpi=pmi2 ./hello_world
Slurm 升级不会影响此 MPICH 安装。只有一种不太可能的情况需要在升级后重新编译 MPI 堆栈,即当我们强制链接到 Slurm 的 PMI-1 和/或 PMI-2 库,并且它们的 API 发生变化时。这些通常不会频繁变化,但如果发生变化,将在 Slurm 的 RELEASE_NOTES 文件中注明。
使用 PMIx 的 MPICH 并与 Slurm 集成
您还可以使用外部 PMIx 库构建 MPICH,该库应与构建 Slurm 时使用的相同:
$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ ../configure \ > --prefix=/home/user/bin/mpich/ \ > --with-pmix=/home/user/bin/pmix_4.1.2/ \ > --with-pmi=pmix \ > --with-slurm=/home/user/slurm/master/inst
以这种方式构建后,任何执行都必须使用 Slurm(srun),因为 Hydra 进程管理器未安装,如前面的示例所示。 编译并运行进程:
$ mpicc -o hello_world hello_world.c $ srun --mpi=pmix ./hello_world
MPICH 及其内部 PMI 与 Slurm 集成
另一种选择是仅编译 MPICH,但不设置 --with-pmilib、--with-pmix 或 --with-pmi,仅保留 --with-slurm。 在这种情况下,MPICH 将不会强制链接到任何 PMI 库,并将默认安装 mpiexec.hydra 命令。这将导致它使用其内部 PMI 实现(基于 PMI-1)和 Slurm API 函数来检测作业环境并相应地启动进程:
user@testbox:~/mpich-4.0.2/build$ ../configure \ > --prefix=/home/user/bin/mpich/ \ > --with-slurm=/home/user/slurm/22.05/inst
然后可以使用 srun 或 mpiexec 运行应用程序:
$ mpicc -o hello_world hello_world.c $ srun ./hello_world
或
$ mpiexec.hydra ./hello_world
mpiexec.hydra 将使用 srun 启动的 Slurm 步骤启动其守护进程,并将使用其内部 PMI 实现。
注意:在这种情况下,使用 --with-slurm 选项编译创建了 Hydra 启动命令(mpiexec.hydra 和其他命令)并将它们链接到版本化的 Slurm 主公共 API(libslurm.so.X.0.0)。这是因为这些命令使用一些 Slurm 函数来检测作业环境。 因此,请注意,升级 Slurm 将需要重新编译 MPICH 堆栈。通常只需将链接库的名称符号链接到新库,但这并不能保证有效。
MPICH 无 Slurm 集成
最后,可以编译 MPICH 而不与 Slurm 集成。 在这种情况下,它将无法识别作业,并将仅像在本地机器上一样运行进程。我们建议阅读 MPICH 文档和配置脚本以获取有关现有可能性的更多信息。
MVAPICH2
MVAPICH2 支持 Slurm。要启用它,您需要使用类似于以下的命令构建 MVAPICH2:
$ ./configure --prefix=/home/user/bin/mvapich2 \ > --with-slurm=/home/user/slurm/22.05/inst/
注意:在某些 MVAPICH2 版本和使用 GCC > 10.x 构建时,可能需要将这些标志添加到配置行的前面:
FFLAGS="-std=legacy" FCFLAGS="-std=legacy" ./configure ...
当 MVAPICH2 使用 Slurm 支持构建时,它将检测到它在 Slurm 分配内,并将使用 'srun' 命令启动其 Hydra 守护进程。它不链接到 Slurm API,这意味着在 Slurm 升级期间无需重新编译 MVAPICH2。默认情况下,它将使用内部 PMI 实现。
请注意,默认情况下,Slurm 将注入两个环境变量,以确保 mpirun 或 mpiexec 将使用 Slurm 启动机制(srun)来启动 Hydra。 有了这些,Hydra 还将向 srun 传递参数 '--external-launcher',以便不将这些 Hydra 进程视为常规步骤。可以通过在 slurm.conf 中设置 "MpiParams=disable_slurm_hydra_bootstrap" 来禁用此自动变量注入机制,除非在 "slurm" 已明确设置为引导程序的情况下。
可以使用不同的引导机制运行 MVAPICH2。为此,在使用 sbatch 或 salloc 提交作业之前,明确设置以下环境变量:
$ export HYDRA_BOOTSTRAP=ssh $ salloc -N10 $ mpirun -np <num_procs> user_app.bin
使用 srun 和链接 Slurm 的 PMI-1 或 PMI-2 库的 MVAPICH2
可以强制 MVAPICH2 使用 Slurm 的 PMI-1(libpmi.so.0.0.0)或 PMI-2(libpmi2.so.0.0.0)库。以这种模式构建将导致所有执行都使用 Slurm 及其 PMI 库。 Hydra 进程管理器二进制文件(mpiexec)将不会安装。实际上,mpiexec 命令将作为 Slurm 的 srun 命令的符号链接存在。建议不要使用 PMI-1,而至少使用 PMI-2 库。 以下是配置和使用的示例:
对于 PMI-2: ./configure --prefix=/home/user/bin/mvapich2 \ > --with-slurm=/home/user/slurm/22.05/inst/ \ > --with-pm=slurm --with-pmi=pmi2 对于 PMI-1: ./configure --prefix=/home/user/bin/mvapich2 \ > --with-slurm=/home/user/slurm/22.05/inst/ \ > --with-pm=slurm --with-pmi=pmi1
要在 Slurm 中编译和运行用户应用程序:
$ mpicc -o hello_world hello_world.c $ srun --mpi=pmi2 ./hello_world
有关更多信息,请参见 MVAPICH2 文档中的网页
使用 Slurm 支持并链接外部 PMIx 的 MVAPICH2
可以在 MVAPICH2 中使用 PMIx 并与 Slurm 集成。这样将不会安装 Hydra 进程管理器,用户应用程序需要使用 srun 运行,前提是 Slurm 已针对与构建 MVAPICH2 时使用的相同或兼容的 PMIx 版本进行编译。
要构建 MVAPICH2 以使用 PMIx 并与 Slurm 集成,需要类似于以下的配置行:
./configure --prefix=/home/user/bin/mvapich2 \ > --with-slurm=/home/user/slurm/master/inst/ \ > --with-pm=slurm \ > --with-pmix=/home/user/bin/pmix_4.1.2/ \ > --with-pmi=pmix
运行作业的方式与之前的示例类似:
$ mpicc -o hello_world hello_world.c $ srun --mpi=pmix ./hello_world
注意:在 MVAPICH2 的情况下,编译时与 Slurm 集成(--with-slurm)不会对命令或库添加任何依赖关系,因此升级 Slurm 应该是安全的,无需重新编译 MVAPICH2。只有一种不太可能的情况需要在升级后重新编译 MPI 堆栈,即当我们强制链接到 Slurm 的 PMI-1 和/或 PMI-2 库,并且它们的 API 发生变化时。这些通常不会频繁变化,但如果发生变化,将在 Slurm 的 RELEASE_NOTES 文件中注明。
HPE Cray PMI 支持
Slurm 默认带有一个 Cray PMI 特定插件,提供与 HPE Cray 编程环境的 PMI 兼容性。它旨在用于在 HPE Cray 机器上使用此环境构建的应用程序。
该插件名为 cray_shasta(Shasta 是此插件支持的第一个 Cray 架构),并在所有 Slurm 安装中默认构建。通过运行以下命令可以查看其可用性:
$ srun --mpi=list MPI 插件类型是... cray_shasta none
Cray PMI 插件将使用一些保留端口进行通信。这些端口可以通过在 srun 命令行中使用 --resv-ports 选项,或在 slurm.conf 中设置 MpiParams=ports=[port_range] 来配置。此选项中列出的第一个端口将用作 PMI 控制端口,由 Cray 定义为 PMI_CONTROL_PORT 环境变量。不能在同一节点上使用相同的 PMI_CONTROL_PORT 启动多个应用程序。
此插件不支持 MPMD/异构作业,并且需要 libpals >= 0.2.8。
最后修改于 2024 年 12 月 12 日