11.2.3. 共享内存

11.2.3.1. sm BTL传输层

sm BTL是一种通过共享内存在两个进程之间传输数据的低延迟、高带宽机制。该BTL仅能在同一节点上执行的进程之间使用。

注意

在Open MPI版本1.8.0到4.1.x之间,共享内存BTL被命名为vader。从Open MPI 5.0.0版本开始,该BTL已更名为sm

警告

在Open MPI 5.0.x版本中,名称vader只是sm BTL的别名。同样地,所有以vader_为前缀的MCA参数都会自动映射到对应的以sm_为前缀的MCA参数。

这个别名机制是一个遗留的过渡设备,可能会在未来的Open MPI版本中消失。


11.2.3.2. 指定使用sm进行MPI消息传递

通常情况下无需手动指定;OpenMPI会自动为每次通信选择最优的BTL传输层。

尽管如此,您可以使用MCA参数btl。您还应该为进程与其自身之间的通信指定self BTL。此外,如果您的作业中并非所有进程都在同一个单节点上运行,那么您还需要为节点间通信指定一个BTL。例如:

shell$ mpirun --mca btl self,sm,tcp -n 16 ./a.out

11.2.3.3. 调优参数以提升性能

大多数情况下,MCA参数的默认值已经过优化以提供良好性能。要进一步优化性能需要一定的技巧。有时这需要在性能和内存占用之间进行权衡。

  • btl_sm_eager_limit: 如果消息数据加上头部信息的大小在此限制范围内,消息将以"急切"方式发送——即发送方会尝试将整个消息写入共享缓冲区,而无需等待接收方准备就绪。超过此大小时,发送方仅会写入消息的第一部分,然后等待接收方确认其准备就绪后再继续传输。急切发送可以通过解耦发送方与接收方来提高性能。

  • btl_sm_max_send_size: 大消息会按此大小分段发送。较大的分段可能带来更高的效率,但也可能影响发送方与接收方之间的流水线处理。

  • btl_sm_free_list_num: 该参数表示每个(急迫型和最大型)空闲列表上初始的片段数量。空闲列表会根据资源拥塞情况动态增长,但您可以通过增加此参数来预先为更多片段预留空间。

  • btl_sm_backing_directory: 用于存放共享内存通信后备文件的目录。该目录应位于本地文件系统上,例如/tmp/dev/shm(默认值:(Linux系统)/dev/shm,(其他系统)会话目录)


11.2.3.4. 共享内存机制

sm BTL支持两种共享内存通信模式:

  1. 双拷贝模式: 也称为"拷贝入/拷贝出"模式,该模式下发送方将数据拷贝到共享内存中,接收方再从共享内存拷贝数据。

    此机制始终可用。

  2. 单拷贝模式: 在此模式下,发送方或接收方会将消息数据从源进程的缓冲区一次性拷贝到目标进程的缓冲区。Open MPI支持三种共享内存单拷贝传输方式:

    • Linux KNEM. 这是一个独立的Linux内核模块,专为高性能计算(HPC)和MPI库设计,以实现高性能的单拷贝消息传输。

      Open MPI需要能够找到KNEM头文件才能构建对KNEM的支持。

    • Linux XPMEM. 类似于KNEM,这是一个独立的Linux内核模块,专为高性能计算(HPC)和MPI库设计,以实现高性能的单拷贝消息传输。它源自Cray XPMEM系统。

      Open MPI需要能够找到XPMEM头文件才能构建对XPMEM的支持。

    • Linux跨内存附加(CMA)。这一机制内置于现代版本的Linux内核中。虽然性能优于双拷贝共享内存传输机制,但CMA是单拷贝机制中性能最低的。不过,CMA可能是最广泛可用的机制,因为它在多个现代Linux发行版中默认启用。

      openmpi必须在具有足够新版Glibc和内核版本的Linux系统上构建,才能支持Linux CMA。

运行时使用哪种机制取决于Open MPI的构建方式以及系统的配置。您可以通过以下两种方式检查Open MPI构建时支持的单拷贝机制:

  1. 在运行configure结束时,Open MPI会输出一份已找到相关头文件和库的传输方式列表,表明它将能够构建对这些传输方式的支持。例如,你可能会看到如下内容:

    共享内存/拷贝输入+拷贝输出:是
    共享内存/Linux CMA:是
    共享内存/Linux KNEM:否
    共享内存/XPMEM:否
    

    上述输出表明Open MPI将构建支持2次拷贝(如前所述,2次拷贝是始终可用的)和Linux CMA支持。KNEM和XPMEM支持将不会被构建。

  2. 安装Open MPI后,可以使用ompi_info命令查看可用的smsc(共享内存单拷贝)组件:

    shell$ ompi_info | grep smsc
              MCA smsc: cma (MCA v2.1.0, API v1.0.0, Component v5.1.0)
    

    此Open MPI安装仅支持Linux CMA单拷贝机制。

注意

正如SMSC组件名称所暗示的,它们在macOS上均不受支持。macOS用户将使用双拷贝机制。


11.2.3.5. 文件系统上的共享内存映射

文件的默认位置位于/dev/shm目录中。如果系统中不存在/dev/shm,则默认位置将为OMPI会话目录。路径通常类似于:/dev/shm/sm_segment.nodename.user_id.job_id.my_node_rank。例如,完整路径可能是:/dev/shm/sm_segment.x.1000.23c70000.0

您可以使用MCA参数btl_sm_backing_directory将该目录放置在非默认位置。

注意

会话目录可以通过PRRTE使用--prtemca prte_tmpdir_base /path/to/somewhere进行自定义。

注意

即使在使用类似CMA这样的单拷贝方法时,仍会创建一个共享内存文件用于管理连接元数据。