c-为MPI程序"英特尔i7第八代"(6个内核,每个内核2个线程)计算变量秩和大小的有效值范围



请建议如何计算mpi:的有效等级和大小

下面的Hello World C-MPI程序将被编译为可执行文件名为的文件/hello,并在具有Intel i7第8代(6核2核)的服务器上执行每个内核的线程)和16GB的内存。

#include <mpi.h>
#include <stdio.h>
int main (int argc, char* argv[])
{
int rank, size;
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */
printf( "Hello world from process %d of %dn", rank, size );
MPI_Finalize();
return 0;
}

是mpirun-np 24/你好,一个有效的执行命令?为您的回答,如果您的回答是肯定的,请提供变量的有效值范围等级和大小。

这是一个不合理的问题,因为排名的最大数量取决于太多因素,很难给出简短和/或完整的答案。

首先,MPI_Comm_size()MPI_Comm_rank()的输出自变量都是int,在当今大多数平台上都是32位的,因此施加了20亿(231-1)个秩的硬上限。

然后是特定MPI实现所施加的限制。不幸的是,MPI没有指定在MPI作业中获得最大列数的方法,您必须查阅实现的文档,但假设大多数都使用ints进行内部索引,因此限制可能相同——20亿列。

然后是MPI库如何实现MPI排名的问题。由于Linux上的大多数现成MPIs都是操作系统进程,因此我们需要研究有多少进程可以同时运行。

首先,Linux内核可以处理的进程数量是最大的。默认情况下,当进程ID(PID)达到/proc/sys/kernel/pid_max中指定的值(系统引导时为32768)时,进程ID会自动换行。这是32位Linux的上限,也是64位Linux的默认限制(为了向后兼容),但在64位Linux上可以更改为222。除了总是为1的非常特殊的第一个用户进程(古老的init)之外,用户进程的PID从300开始。因此,除了init之外,最多可以有2个22个-300个进程同时运行,大约有420万个,但通常会更少,因为内核线程也会占用PID空间。

然后是由ulimit机制施加的用户限制。ulimit -u为用户设置或获取运行进程的限制。Ubuntu 18.04上的默认值是483294,这也是该限制(即硬限制)的最大可能值。由于MPI作业通常使用相同的用户名运行,因此此限制限制了一个作业可以拥有的列组数。

典型的MPI实现带有一个特殊的启动程序,因此您不能在64位Ubuntu 18.04上启动一个排名超过483293的MPI作业。但同样,这只是一个上限。还有更多。

每个操作系统进程都有自己的虚拟地址空间页表和相应的内核结构,这些内核结构消耗内存。最重要的是进程完成的任何额外内存分配。您的问题中的最小MPI程序添加了对sleep(3)的调用,以便在程序退出前有时间运行ps命令,该程序在64位Ubuntu 18.04上使用Open MPI编译,并去掉了调试符号,每个秩的常驻集大小(RSS)为12 MiB。mpiexec启动器有更多的内存,它的内存使用量会随着MPI列的数量而增加,但我们忽略这一点。忽略内核内存的使用以及在典型的Linux系统上还有其他进程的事实,您不能运行超过(16GiB+交换量)/12个MiB进程。交换大小通常从完全不交换到RAM大小的两倍不等,尽管它实际上可以是任何东西。如果没有交换,您的等级限制为1364。交换大小是RAM大小的两倍,您可以拥有4095个列。为了简单起见,我们假设前一种情况,即没有交换,因此限制为1364个等级。

这个简单的程序不做任何计算密集型的事情。如果它真的在计算什么,那么这1364个级别将竞争12个逻辑CPU,每个本地CPU 114个进程,这有点荒谬。因此,如果有很好的选择可以通过使用超线程隐藏内存延迟,那么更合理的限制将是12,如果程序运行的是一些非常紧密的循环,而这些循环不能经常访问核心专用缓存之外的数据,那么甚至只有6。

所以,正如你所看到的,你关于有效范围的问题是不合理的。至于在12个逻辑CPU上运行,总共有24个MPI列,它们只输出"Hello world",这很好。

至于启动24列MPI作业时ranksize的值可能是什么,答案是,对于MPI作业,MPI_COMM_WORLD的大小是全局固定的,并且是最初使用-np参数请求的MPI列数,而实际列数从0size - 1不等。

最新更新