前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >InfiniBand与MPI

InfiniBand与MPI

原创
作者头像
用户8891103
发布2023-09-14 00:42:03
1K0
发布2023-09-14 00:42:03
举报
IB/RDMA如何配合使用?看看走的是TCPIP协议还是需要专门引入包?

IB(InfiniBand)和 RDMA(Remote Direct Memory Access)是一种高性能网络技术,通常用于加速数据传输。它们不是基于传统的 TCP/IP 协议栈,而是使用自己的协议栈,以实现低延迟、高带宽的数据传输。

IB 和 RDMA 的主要特点包括:

  1. RDMA操作:RDMA 允许远程服务器直接访问本地内存,从而避免了数据在发送方和接收方之间的多次内存复制。这大大降低了数据传输的延迟和CPU开销。
  2. 零拷贝:RDMA 可以实现零拷贝数据传输,数据从发送方的内存直接传输到接收方的内存,避免了中间的数据缓存。
  3. 用户态操作:RDMA 可以在用户态进行操作,而不需要内核参与。这有助于进一步减少延迟,提高性能。
  4. 专用硬件:IB 和 RDMA 通常需要专用的硬件支持,如网络适配器、交换机等。

IB 和 RDMA 可以在不同的通信库和框架中使用,如 MPI(Message Passing Interface)和 libfabric。要在程序中使用 IB 和 RDMA,通常需要:

  1. 配置和初始化:配置 IB 网络适配器和网络拓扑。使用 RDMA 需要初始化 libfabric 或其他 RDMA 技术相关的库。
  2. 选择适当的协议和接口:IB 和 RDMA 有多种协议和接口可供选择,包括 RC(Reliable Connection)、UC(Unreliable Connection)等。
  3. 创建端点和队列:创建 IB 端点(EndPoint)和相关的队列,用于处理数据传输请求。
  4. 执行 RDMA 操作:使用 RDMA 操作发送和接收数据,如 ibv_post_send()ibv_post_recv()
  5. 管理内存:在进行 RDMA 操作时,需要确保数据在内存中是可访问的,并且进行适当的内存注册和解注册。

需要注意的是,IB 和 RDMA 需要专门的硬件支持和网络基础设施。如果要在 IB/RDMA 网络中使用 TCP/IP 协议进行通信,可能需要一些额外的配置和适配。在某些情况下,可能需要在 IB/RDMA 网络上建立 TCP/IP over RDMA(RoCE)通信,以便与传统的 TCP/IP 网络互操作。

综上所述,IB 和 RDMA 是一种高性能的网络技术,可以显著提高数据传输性能,但在使用时需要考虑硬件支持、协议选择和适当的库/框架。

如何在我的C++项目中使用ibv_post_send?

ibv_post_send 是 InfiniBand Verbs 库中的一个函数,用于发送数据操作。以下是在 C++ 项目中使用 ibv_post_send 的基本步骤:

  1. 包含头文件:首先,需要包含 InfiniBand Verbs 库的头文件。
代码语言:C++
复制
#include <infiniband/verbs.h>
  1. 初始化连接:初始化 InfiniBand 的连接,创建端点等。
代码语言:C++
复制
struct ibv_context *context; // InfiniBand context

// Open the InfiniBand device and create a context
context = ibv_open_device(dev_list[0]); // dev_list is the list of available devices
  1. 创建队列:创建发送和接收队列,用于管理发送和接收操作。
代码语言:C++
复制
struct ibv_pd *pd; // Protection Domain
struct ibv_cq *send_cq; // Completion Queue for sending

// Allocate a Protection Domain
pd = ibv_alloc_pd(context);

// Create a Completion Queue for sending
send_cq = ibv_create_cq(context, MAX_CQ_SIZE, NULL, NULL, 0);
  1. 创建发送请求:创建一个发送请求并设置发送数据的参数。
代码语言:C++
复制
struct ibv_mr *mr; // Memory Region
struct ibv_send_wr wr = {}; // Send work request
struct ibv_sge sge = {}; // Scatter/Gather entry

// Allocate memory for the data
char *send_buf = (char *)malloc(DATA_SIZE);

// Register the memory region for sending
mr = ibv_reg_mr(pd, send_buf, DATA_SIZE, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE);

// Set up the Scatter/Gather entry
sge.addr = (uintptr_t)send_buf;
sge.length = DATA_SIZE;
sge.lkey = mr->lkey;

// Set up the Send work request
wr.wr_id = 1; // Work request ID
wr.sg_list = &sge;
wr.num_sge = 1;
wr.opcode = IBV_WR_SEND;
wr.send_flags = IBV_SEND_SIGNALED; // Signal a completion
  1. 发送数据:使用 ibv_post_send 函数发送数据。
代码语言:C++
复制
struct ibv_send_wr *bad_wr;

// Post the Send work request
if (ibv_post_send(qp, &wr, &bad_wr) != 0) {
    // Handle error
}
  1. 等待完成:等待发送完成,可以使用 Completion Queue 来检查发送是否完成。
代码语言:C++
复制
struct ibv_wc wc; // Work Completion

// Poll the Completion Queue for completion
while (ibv_poll_cq(send_cq, 1, &wc) == 0) {
    // Waiting for completion
}

// Check completion status
if (wc.status != IBV_WC_SUCCESS) {
    // Handle error
}
  1. 释放资源:在不再使用发送请求和内存时,需要释放相应的资源。
代码语言:C++
复制
ibv_dereg_mr(mr); // Deregister the memory region
ibv_destroy_qp(qp); // Destroy the Queue Pair
ibv_destroy_cq(send_cq); // Destroy the Completion Queue
ibv_dealloc_pd(pd); // Deallocate the Protection Domain
ibv_close_device(context); // Close the device context
free(send_buf); // Free the allocated memory

请注意,上述代码仅为示例,实际使用时需要根据具体情况进行适当的调整和错误处理。同时,为了完整的发送和接收数据,可能还需要实现相应的接收逻辑。

如何编译链接

在编译使用 ibv_post_send 的程序时,需要链接 InfiniBand Verbs 库。编译时可以使用以下步骤:

  1. 编写源代码:将上述使用 ibv_post_send 的示例代码保存为 .cpp 文件。
  2. 编译命令:使用编译命令编译代码,并链接 InfiniBand Verbs 库。
代码语言:shell
复制
g++ -o my_program my_program.cpp -libverbs

在这个命令中,-libverbs 表示链接 InfiniBand Verbs 库。确保您的系统上已经安装了相应的库文件。

如果编译中出现找不到库的错误,您可能需要提供库的路径。例如:

代码语言:shell
复制
g++ -o my_program my_program.cpp -L/path/to/infiniband/libs -libverbs

请将 /path/to/infiniband/libs 替换为实际的库文件所在路径。

请注意,具体的命令可能会因为系统环境和库的位置而有所不同。确保您的系统已经正确安装了 InfiniBand Verbs 库,并根据需要进行适当的调整。

g++ -o main_send_recv_ib main_send_recv_ib.cpp -O2 -std=c++11 -libverbs -lpthread -ldl -lnl-3

多进程版本编译

mpic++ -o main_send_recv_ib main_send_recv_ib.cpp -O2 -std=c++11 -libverbs -lpthread -ldl -lnl-3

  • dl库
    • 报错: 我使用如下的命令进行编译 yufande@cpu001 test_MPI_info$ g++ -o main_send_recv_ib main_send_recv_ib.cpp -O2 -std=c++11 -libverbs -lpthread ,报错: /lib/../lib64/libibverbs.a(src_libibverbs_la-init.o): In function load_driver': (.text+0x2be): undefined reference todlopen'

错误信息表明在链接时找不到dlopen函数,这个函数属于libdl库。您应该在命令行中加入-ldl来链接这个库。

所以,您的编译命令应更改为:

代码语言:shell
复制
[yufande@cpu001 test_MPI_info]$ g++ -o main_send_recv_ib main_send_recv_ib.cpp -O2 -std=c++11 -lverbs -lpthread -ldl

注意,我去掉了您命令中的-libverbs,因为正确的是-lverbs。您只需要在库的名字前加上-l前缀即可。

  • NL库

这个错误指出libibverbs试图使用libnl(Netlink库)的功能,但没有链接到相关的库。libnl是Linux的一个库,用于内核和用户空间进程之间的通信。

您需要确保已经安装了libnl,并在编译时链接它。一般情况下,libnl有三个版本: libnl1, libnl3, 和最新版本。您需要查看系统上有哪个版本,并链接对应的版本。

这里是一个通用的例子来链接libnl-3

代码语言:shell
复制
[yufande@cpu001 test_MPI_info]$ g++ -o main_send_recv_ib main_send_recv_ib.cpp -O2 -std=c++11 -libverbs -lpthread -ldl -lnl-3

如果上述命令仍然不工作,那么您可能还需要链接其他的libnl相关库,例如-lnl-route-3

如果您的系统上没有libnl库,您可能需要使用您的包管理器安装它。例如,在Debian和Ubuntu上:

代码语言:shell
复制
sudo apt-get install libnl-3-dev

或在Red Hat/Fedora上:

代码语言:shell
复制
sudo yum install libnl3-devel

安装后,再次尝试编译并链接。

  • NL库cryomate上面没有,安装之后终于编译成功。
代码语言:text
复制
  • 问题与建议

当然可以,以下是对代码的一些建议和注意事项:

  1. 内存清理:请确保在cleanup_ib_resources函数中也清理dev_list,使用ibv_free_device_list
代码语言:C++
复制
if (dev_list)
{
    ibv_free_device_list(dev_list);
}
  1. 使用MPI处理错误:您已将exit(1)调用替换为MPI_Abort(MPI_COMM_WORLD, 1),这是一个好决策,因为当其中一个进程出现错误时,它确保所有MPI进程都被终止。
  2. 进程数假设:您在发送和接收逻辑中假设了一个两节点的系统(send_part(data, 1))。如果您打算在将来在两个以上的节点上运行代码,您需要相应地进行修改。
  3. 队列对初始化:确保在发布任何发送/接收操作之前,队列对(QP)转移到适当的状态(RESET、INIT、RTR、RTS)。这个步骤似乎缺失。
  4. 其他IB进程初始化:确保运行在不同节点上的进程交换必要的信息,如QP编号、LID等,并相应地修改QP的属性,使其准备好进行通信。
  5. MPI同步:虽然您已经计时了发送和接收操作,但在启动计时器之前添加MPI_Barrier(MPI_COMM_WORLD)可以确保所有进程同时启动。
  6. 动态数据分配:数据大小硬编码为1GB。如果您打算使用不同的数据大小进行测试,您可能希望将其作为命令行参数或环境变量。
  7. 多次接收:鉴于您创建了一个设置为10的max_recv_wr的QP,如果您的应用程序需要,您可能希望同时发布多个接收。但这完全取决于您的应用程序的用例。

请记住,将MPI与RDMA(通过verbs)集成并不是直截了当的。正确的RDMA设置需要了解硬件、连接和底层拓扑,并且经常还涉及与交换QP信息、设置连接和管理缓冲区相关的其他设置。所提供的代码只包括基本的verbs操作,并且缺少RDMA的连接设置。

最后,始终在放大之前进行小规模测试。这样,您可以快速识别并纠正问题。

ibv_devinfo

yufande@loginnode test_MPI_info$ ibv_devinfo

hca_id: mlx4_0

代码语言:txt
复制
transport:                      InfiniBand (0)
代码语言:txt
复制
fw_ver:                         2.42.5000
代码语言:txt
复制
node_guid:                      b859:9f03:009c:65b0
代码语言:txt
复制
sys_image_guid:                 b859:9f03:009c:65b3
代码语言:txt
复制
vendor_id:                      0x02c9
代码语言:txt
复制
vendor_part_id:                 4099
代码语言:txt
复制
hw_ver:                         0x1
代码语言:txt
复制
board_id:                       DEL1100001019
代码语言:txt
复制
phys_port_cnt:                  1
代码语言:txt
复制
Device ports:
代码语言:txt
复制
  port:   1
代码语言:txt
复制
    state:                  PORT_ACTIVE (4)
代码语言:txt
复制
    max_mtu:                4096 (5)
代码语言:txt
复制
    active_mtu:             4096 (5)
代码语言:txt
复制
    sm_lid:                 27
代码语言:txt
复制
    port_lid:               28
代码语言:txt
复制
    port_lmc:               0x00
代码语言:txt
复制
    link_layer:             InfiniBand
如何确定当前节点上,IB库的安装路径?

要确定当前节点上 InfiniBand (IB) 库的安装路径,可以执行以下步骤:

  1. 打开终端:使用SSH或直接在计算节点上打开终端。
  2. 使用 which 命令:输入以下命令,以查找 IB 库的安装路径:
代码语言:shell
复制
which ibstat
代码语言:txt
复制
  上述命令将查找 `ibstat` 命令的路径。通常,`ibstat` 命令是 InfiniBand 工具包的一部分,因此可以通过查找其路径来确定 IB 库的安装位置。
  1. 使用 rpm 查询(仅适用于基于 RPM 的系统):如果您的系统是基于 RPM 的 Linux 发行版(如 CentOS、Red Hat 等),您可以使用 rpm 命令来查询已安装的软件包信息,以查找 IB 库的安装位置。输入以下命令:
代码语言:shell
复制
rpm -qf `which ibstat`
代码语言:txt
复制
  上述命令将返回包含 `ibstat` 命令的软件包名称。然后,您可以使用 `rpm -ql` 命令来查找该软件包的安装文件列表,以确定 IB 库的位置:
代码语言:shell
复制
rpm -ql package_name
代码语言:txt
复制
  请将 `package_name` 替换为您在上一步中找到的软件包名称。
  1. 使用 find 命令:如果上述方法未能找到 IB 库的安装位置,您可以使用 find 命令来搜索包含 IB 库文件的目录。输入以下命令:
代码语言:shell
复制
sudo find / -name "libibverbs.so"
代码语言:txt
复制
  上述命令将在整个文件系统中搜索名为 `libibverbs.so` 的文件。这是 InfiniBand 库的一部分,因此找到这个文件将帮助您确定 IB 库的安装路径。

请注意,具体的命令和路径可能会根据您的系统配置和安装方式而有所不同。查找 IB 库的确切路径可能需要一些试验和搜索,但上述方法应该帮助您找到所需的信息。

如何确认自己的MPI程序有没有使用到IB?

要确定MPI程序是否使用了InfiniBand (IB),您可以采用以下方法:

  1. 查看MPI文档或信息
代码语言:txt
复制
  大多数MPI实现(如OpenMPI、MVAPICH、Intel MPI)都支持多种网络后端。您可以查看其文档或在线资源,以确定默认的网络后端以及如何指定/更改它。
  1. 使用**mpirun**或**mpiexec**的**--mca**或**-genv**参数
代码语言:txt
复制
  对于OpenMPI,您可以使用`--mca`参数来显示或设置网络后端。例如:
代码语言:shell
复制
mpirun --mca btl_base_verbose 30 -np 2 ./your_mpi_program
代码语言:txt
复制
  这会在执行过程中显示BTL(Byte Transfer Layer)的详细信息。如果您看到与`openib`相关的输出,那么程序可能正在使用InfiniBand。
代码语言:txt
复制
  对于Intel MPI,您可以使用`-genv`参数来检查或设置网络后端。例如:
代码语言:shell
复制
mpiexec -genv I_MPI_DEBUG 5 -np 2 ./your_mpi_program
代码语言:txt
复制
  这将显示详细的调试输出,您可以在其中查找与InfiniBand相关的信息。
  1. 检查运行时环境变量
代码语言:txt
复制
  有时,特定的MPI实现可能会依赖于环境变量来确定网络后端。例如,在OpenMPI中,您可以设置`OMPI_MCA_btl`环境变量来指定网络后端。
代码语言:txt
复制
  查看这些环境变量的当前值可以为您提供关于正在使用的后端的线索。例如:
代码语言:shell
复制
echo $OMPI_MCA_btl
  1. 使用系统工具
代码语言:txt
复制
  使用`lsof`或`netstat`等系统工具,您可以观察MPI程序运行时的网络连接。例如,如果您的程序正在使用InfiniBand端口(默认为31415或其他),那么您可能会在`lsof`的输出中看到它。
  1. 查看MPI的编译配置
代码语言:txt
复制
  大多数MPI实现在编译时会决定支持哪些通信接口。例如,对于OpenMPI,您可以查找其配置日志或使用`ompi_info`命令来检查它是否与InfiniBand支持一起编译。
代码语言:shell
复制
ompi_info | grep openib
代码语言:txt
复制
  如果您看到与`openib`相关的输出,那么OpenMPI已经与InfiniBand支持一起编译。
  1. 性能测试
代码语言:txt
复制
  一种简单但不精确的方法是观察您的程序的性能。InfiniBand通常提供比标准以太网更高的带宽和更低的延迟。因此,如果您的MPI通信性能非常高,那么您可能正在使用InfiniBand。但请注意,这种方法不太可靠,因为许多其他因素也会影响性能。

考虑到MPI的多样性,建议您查看特定MPI实现的文档,以便获取最准确和详细的信息。

如何确定MPICH库有没有使用ib

要确定MPICH库是否使用了InfiniBand (IB),您可以采用以下方法:

  1. 查看**mpichversion**或**mpiexec**的输出
代码语言:txt
复制
  运行`mpichversion`可以显示关于您的MPICH安装的信息。这通常会包括有关配置和编译选项的信息。
代码语言:shell
复制
mpichversion
代码语言:txt
复制
  或者,您可以使用`mpiexec`来显示调试信息:
代码语言:shell
复制
mpiexec -info
代码语言:txt
复制
  在这些输出中查找与`ch3:ofi`或`ch3:sock`或`ch3:nemesis`等通道/设备接口相关的信息。`ch3:ofi`接口可能表示MPICH使用了libfabric,这可能意味着它配置为使用InfiniBand。
  1. 查看运行时环境变量
代码语言:txt
复制
  MPICH通过一系列环境变量来控制其行为。尤其是`MPICH_NETMOD`环境变量可以用来指定或查询网络模块。
代码语言:txt
复制
  查看其值:
代码语言:shell
复制
echo $MPICH_NETMOD
代码语言:txt
复制
  如果返回值是`ofi`,那么可能正在使用libfabric,这可能意味着它配置为使用InfiniBand。
  1. 查看MPICH的编译配置
代码语言:txt
复制
  检查MPICH的编译配置,特别是查看是否启用了InfiniBand支持。如果您有源代码并从源代码构建MPICH,那么您可以查看配置日志。
代码语言:txt
复制
  如果MPICH已安装,您还可以尝试使用`mpicc -show`命令,这将显示用于编译MPI程序的命令。在这些命令中查找与InfiniBand相关的库和头文件。
  1. 使用系统工具
代码语言:txt
复制
  当您的MPI程序运行时,使用`lsof`或`netstat`等系统工具观察其网络连接。如果您的程序正在使用InfiniBand端口(如31415或其他),那么您可能会在这些工具的输出中看到它。
  1. 查看安装/编译时的文档或输出
代码语言:txt
复制
  如果您自己编译了MPICH,那么在配置和编译过程中的输出可能会提供关于是否启用InfiniBand支持的线索。
  1. 性能测试
代码语言:txt
复制
  如果您的MPI通信性能明显高于标准以太网,那么这可能是一个线索,说明您正在使用InfiniBand。然而,这种方法不是特别可靠,因为许多其他因素也可以影响性能。

考虑到MPI库的多样性和配置的复杂性,建议您查看特定MPICH安装的文档或与管理员联系,以获取最准确的信息。

mpiexec -info
代码语言:text
复制
[yufande@loginnode test_MPI_info]$ mpiexec -info
HYDRA build details:
    Version:                                 3.2
    Release Date:                            Wed Nov 11 22:06:48 CST 2015
    CC:                              gcc
    CXX:                             g++
    F77:                             gfortran
    F90:                             gfortran
    Configure options:                       '--disable-option-checking' '--prefix=/Share/Software/mpich-3.2' '--cache-file=/dev/null' '--srcdir=.' 'CC=gcc' 'CFLAGS= -O2' 'LDFLAGS=' 'LIBS=-lpthread ' 'CPPFLAGS= -I/root/software/mpich-3.2/src/mpl/include -I/root/software/mpich-3.2/src/mpl/include -I/root/software/mpich-3.2/src/openpa/src -I/root/software/mpich-3.2/src/openpa/src -D_REENTRANT -I/root/software/mpich-3.2/src/mpi/romio/include'
    Process Manager:                         pmi
    Launchers available:                     ssh rsh fork slurm ll lsf sge manual persist
    Topology libraries available:            hwloc
    Resource management kernels available:   user slurm ll lsf sge pbs cobalt
    Checkpointing libraries available:
    Demux engines available:                 poll sele
mpichversion
代码语言:text
复制
MPICH Version:          3.2
MPICH Release date:     Wed Nov 11 22:06:48 CST 2015
MPICH Device:           ch3:nemesis
MPICH configure:        --prefix=/Share/Software/mpich-3.2
MPICH CC:       gcc    -O2
MPICH CXX:      g++   -O2
MPICH F77:      gfortran   -O2
MPICH FC:       gfortran   -O2

从您提供的mpichversion输出中,MPICH的版本是3.2,并且使用的设备是ch3:nemesis

ch3是通道接口3,这是MPICH用于消息传递的核心部分。nemesis是它的网络模块。

要确定nemesis是否使用了InfiniBand,需要深入查看该nemesis网络模块的配置和使用的具体网络子模块。nemesis可以与多种网络子模块一起使用,包括但不限于TCP、IB(InfiniBand)、MXM等。

在您的输出中,并没有直接提及是否使用了InfiniBand。因此,要确切知道,您可能需要:

  1. 查看MPICH的安装/编译日志:检查在编译和安装MPICH时的配置和输出可能会提供更多线索。查找与InfiniBand或IB相关的条目。
  2. 检查运行时环境变量:例如,MPICH_NEMESIS_NETMOD环境变量可能用于指定nemesis应使用哪个网络子模块。
  3. 重新配置和编译MPICH:如果您有源代码并且可以重新编译它,您可以查看./configure脚本的帮助选项,并确定是否有与InfiniBand相关的选项。这可以通过运行./configure --help在源代码目录中完成。
  4. 联系管理员或查看系统文档:如果您在集群上工作,并且该MPICH是由系统管理员提供的,他们可能知道该特定安装是否支持InfiniBand。此外,查看任何与MPICH安装相关的系统文档也可能有助于提供答案。

最后,请注意,只有在您的硬件和操作系统支持InfiniBand,并且已安装了必要的InfiniBand驱动程序和库时,MPICH才能使用InfiniBand。

MPI 编译:需要专门配置IB

mpich.org/static/downloads/3.1/mpich-3.1-README.txt

如何查询IB库的安装位置

要查询InfiniBand(IB)库的安装位置,您可以尝试以下方法:

  1. 通过命令行查询: 打开终端并输入以下命令,以查找InfiniBand库的安装位置:
代码语言:shell
复制
dpkg-query -L libibverbs-dev  # For Debian/Ubuntu
rpm -ql libibverbs-devel     # For Red Hat/CentOS
代码语言:txt
复制
  这些命令将显示与InfiniBand库关联的文件和目录列表,您可以从中找到库的安装位置。
  1. 通过搜索命令: 如果您不确定库的名称,您可以尝试使用搜索命令来查找与InfiniBand相关的包:
代码语言:shell
复制
dpkg -l | grep ibverbs   # For Debian/Ubuntu
rpm -qa | grep ibverbs   # For Red Hat/CentOS
代码语言:txt
复制
  这将显示与InfiniBand相关的安装包列表。然后,您可以根据找到的包名继续使用第一种方法查询安装位置。

请注意,上述命令中的包名可能会根据您的系统和发行版而有所不同。如果您不确定包名,您可以使用类似的关键词进行模糊搜索。

此外,不同的发行版和版本可能会有不同的包管理工具和命令,所以请根据您的系统类型进行相应的操作。

  • cryomate的查询结果
代码语言:text
复制
[yufande@cpu001 test_MPI_info]$ rpm -ql libibverbs-devel
/usr/include/infiniband
/usr/include/infiniband/arch.h
/usr/include/infiniband/driver.h
/usr/include/infiniband/driver_exp.h
/usr/include/infiniband/kern-abi.h
/usr/include/infiniband/kern-abi_exp.h
/usr/include/infiniband/marshall.h
/usr/include/infiniband/ofa_verbs.h
/usr/include/infiniband/opcode.h
/usr/include/infiniband/peer_ops.h
/usr/include/infiniband/sa-kern-abi.h
/usr/include/infiniband/sa.h
/usr/include/infiniband/verbs.h
/usr/include/infiniband/verbs_exp.h
/usr/lib64/libibverbs.so
/usr/lib64/mlnx_ofed/valgrind/libibverbs.so
/usr/share/man/man3/ibv_ack_async_event.3.gz
/usr/share/man/man3/ibv_ack_cq_events.3.gz
/usr/share/man/man3/ibv_alloc_mw.3.gz
/usr/share/man/man3/ibv_alloc_pd.3.gz
/usr/share/man/man3/ibv_attach_mcast.3.gz
/usr/share/man/man3/ibv_bind_mw.3.gz
/usr/share/man/man3/ibv_close_device.3.gz
/usr/share/man/man3/ibv_close_xrcd.3.gz
/usr/share/man/man3/ibv_create_ah.3.gz
驱动查询
代码语言:txt
复制
如果您在使用 `rpm -qa | grep mlnx-ofa` 命令时没有找到 InfiniBand(IB)驱动,可能是因为驱动的名称在系统中的注册名称可能与 "mlnx-ofa" 不完全匹配。InfiniBand 驱动的名称在不同版本和不同发行版的 Linux 中可能会有所不同。
代码语言:txt
复制
在这种情况下,您可以尝试以下方法来查找 IB 驱动的安装信息:
代码语言:txt
复制
1. 使用 `lsmod` 命令查看内核模块:输入以下命令,以查看已加载的内核模块,这可能包括 IB 驱动模块:
代码语言:shell
复制
lsmod | grep ib_
代码语言:txt
复制
    这将列出与 InfiniBand 相关的内核模块,并且可能会提供有关驱动的信息。
代码语言:txt
复制
2. 使用 `modinfo` 命令查看模块信息:您可以使用 `modinfo` 命令查看特定内核模块的详细信息,包括其路径。例如:
代码语言:shell
复制
modinfo ib_core
代码语言:txt
复制
    上述命令将显示有关 `ib_core` 内核模块的信息,其中可能包括模块的路径。
代码语言:txt
复制
3. 检查 `/lib/modules` 目录:InfiniBand 驱动通常位于 `/lib/modules` 目录中的一个子目录中。您可以使用 `ls` 命令检查这个目录,以查找可能包含 IB 驱动的子目录。例如:
代码语言:shell
复制
ls /lib/modules/$(uname -r)/kernel/drivers/infiniband
代码语言:txt
复制
    这将列出与 InfiniBand 驱动相关的文件和目录。您可以进一步探索这些目录以查找驱动文件和信息。
代码语言:txt
复制
请注意,IB 驱动的名称和组织可能因不同的 Linux 发行版和版本而异。如果上述方法都未能找到 IB 驱动的信息,您可能需要参考您的系统文档或联系系统管理员以获取更多帮助。
代码语言:txt
复制
- tem00查询
代码语言:shell
复制
/usr/sbin/ibstatus
[fyu@tem00 MLNX_OFED_LINUX-23.07-0.5.1.2-rhel7.6-x86_64]$ ibstatus
[fyu@tem00 MLNX_OFED_LINUX-23.07-0.5.1.2-rhel7.6-x86_64]$ lsmod | grep ib_
ib_isert               50875  0
iscsi_target_mod      287784  1 ib_isert
ib_srpt                48184  0
target_core_mod       342480  3 iscsi_target_mod,ib_srpt,ib_isert
ib_srp                 57096  0
scsi_transport_srp     20993  1 ib_srp
ib_ucm                 22602  0
ib_uverbs              82662  2 ib_ucm,rdma_ucm
ib_iser                47860  0
ib_umad                22093  0
rdma_cm                59673  5 rpcrdma,ib_srp,ib_iser,rdma_ucm,ib_isert
ib_ipoib              114962  0
libiscsi               57233  1 ib_iser
ib_cm                  53122  5 rdma_cm,ib_srp,ib_ucm,ib_srpt,ib_ipoib
scsi_transport_iscsi    99909  2 ib_iser,libiscsi
ib_core               242235  14 rdma_cm,ib_cm,iw_cm,rpcrdma,mlx4_ib,ib_srp,ib_ucm,ib_iser,ib_srpt,ib_umad,ib_uverbs,rdma_ucm,ib_ipoib,ib_isert


[fyu@tem00 MLNX_OFED_LINUX-23.07-0.5.1.2-rhel7.6-x86_64]$ modinfo ib_core
filename:       /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/infiniband/core/ib_core.ko.xz
alias:          rdma-netlink-subsys-4
license:        Dual BSD/GPL
description:    core kernel InfiniBand API
author:         Roland Dreier
alias:          net-pf-16-proto-20
alias:          rdma-netlink-subsys-5
retpoline:      Y
rhelversion:    7.6
srcversion:     5D44B5BCCB49385B6F5C4C8
depends:
intree:         Y
vermagic:       3.10.0-957.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo:   sha256
parm:           send_queue_size:Size of send queue in number of work requests (int)
parm:           recv_queue_size:Size of receive queue in number of work requests (int)
parm:           force_mr:Force usage of MRs for RDMA READ/WRITE operations (bool)
安装和使用IB驱动自带的Open MPI高性能计算 HPC用户指南裸金属服务器场景典型应用安装和使用MPI(X86 BMS场景)_华为云
代码语言:txt
复制
更新时间:2022-08-29 GMT+08:00
代码语言:txt
复制
**操作场景**
代码语言:txt
复制
本节指导用户在BMS上安装和使用IB驱动自带的Open MPI(以版本3.1.0rc2为例)。
代码语言:txt
复制
对于集群中的每台BMS,都需要执行该操作。
代码语言:txt
复制
**操作步骤**
代码语言:txt
复制
1. 查询是否安装了IB驱动。
    1. 执行以下命令,查询是否已成功安装IB驱动。
代码语言:txt
复制
        **$ ls /usr/mpi/gcc/openmpi-3.1.0rc2/bin/mpirun**
代码语言:txt
复制
        **$ rpm -qa | grep mlnx-ofa**
代码语言:txt
复制
        **图1** 确认已安装IB驱动  
代码语言:txt
复制
        ![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133324440.png)
代码语言:txt
复制
    2. 查看回显结果。
        - 如果回显如[图1](#hpc_04_0008__fig17357957101819)所示,表示已安装IB驱动,执行[3](#hpc_04_0008__li773103104927)。
        - 如果未安装IB驱动,执行[2](#hpc_04_0008__li48212760104917)。
2. 安装IB驱动。
    1. 下载安装包“MLNX\_OFED\_LINUX-4.3-1.0.1.0-rhel7.3-x86_64.tgz”。
代码语言:txt
复制
        下载地址:[https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/](https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/)
代码语言:txt
复制
        **图2** IB驱动的下载页面  
代码语言:txt
复制
        ![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133350636.png)
代码语言:txt
复制
    2. 执行以下命令,安装软件包。
代码语言:txt
复制
        **# yum install tk tcl**
代码语言:txt
复制
        **# tar -xvf MLNX_OFED_LINUX-4.3-1.0.1.0-rhel7.3-x86_64.tgz**
代码语言:txt
复制
        **# cd MLNX_OFED_LINUX-4.3-1.0.1.0-rhel7.3**-x86_64
代码语言:txt
复制
        **# ./mlnxofedinstall**
代码语言:txt
复制
3. 配置环境变量。
    1. 使用vim编辑“~/.bashrc”文件,添加如下配置内容:
代码语言:txt
复制
        **export PATH=$PATH:/usr/mpi/gcc/openmpi-3.1.0rc2**/bin
代码语言:txt
复制
        **export LD_LIBRARY_PATH=/usr/mpi/gcc/openmpi-3.1.0rc2**/lib64
代码语言:txt
复制
    2. 执行以下命令,查看MPI环境变量是否正常。
代码语言:txt
复制
        **$ which mpirun**
代码语言:txt
复制
        **图3** 查看IB驱动自带的Open MPI环境变量  
代码语言:txt
复制
        ![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133324266.png)
代码语言:txt
复制
        如果回显如[图3](#hpc_04_0008__fig37650618112345)所示,表示环境变量配置成功。
代码语言:txt
复制
4. 执行以下命令,在单台BMS上运行IB驱动自带的Open MPI。
代码语言:txt
复制
    **$ mpirun -np 2 -mca btl_openib_if_include "mlx5_0:1" -x MXM_IB_USE_GRH=y /usr/mpi/gcc/openmpi-3.1.0rc2**/tests/imb/IMB-MPI1 PingPong
代码语言:txt
复制
    **图4** 单台BMS上运行Open MPI  
代码语言:txt
复制
    ![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133251881.png)

如何在cryomate上使用ib自带的openmpi?

  • 指定ib库自带openmpi的路径,注意将openmpi的路径放在PATH之前,优先使用
代码语言:text
复制
[yufande@cpu001 imb]$ export PATH=/usr/mpi/gcc/openmpi-4.0.2rc3/bin:$PATH
[yufande@cpu001 imb]$ export LD_LIBRARY_PATH==/usr/mpi/gcc/openmpi-4.0.2rc3/lib64:$LD_LIBRARY_PATH
  • mpirun运行。注意这里指定了一个nodes.txt,使得测试能够在节点间进行。但是观察最开始的输出发现,无法确认是否使用了多节点:信息都是cpu001的
代码语言:text
复制
[yufande@cpu001 imb]$ mpirun -np 2 -hostfile /ShareSSD/yufande/ptycho_collection/ptychography/testDebug/20230814_pty_main_Mstep_parallel/test_MPI_info/nodes.txt  -mca btl_openib_if_include "mlx5_0:1" -x MXM_IB_USE_GRH=y ./IMB-MPI1 PingPong
[1693795271.338206] [cpu001:167023:0]       ib_verbs.h:84   UCX  ERROR ibv_exp_query_device(mlx4_0) returned 38: No space left on device
[1693795271.338342] [cpu001:167022:0]       ib_verbs.h:84   UCX  ERROR ibv_exp_query_device(mlx4_0) returned 38: No space left on device
[1693795271.372751] [cpu001:167022:0]       ib_verbs.h:84   UCX  ERROR ibv_exp_query_device(mlx4_0) returned 38: No space left on device
[1693795271.372950] [cpu001:167022:0]    ucp_context.c:671  UCX  WARN  network device 'mlx5_0:1' is not available, please use one or more of: 'br0'(tcp), 'ib0'(tcp)
[1693795271.374171] [cpu001:167023:0]       ib_verbs.h:84   UCX  ERROR ibv_exp_query_device(mlx4_0) returned 38: No space left on device
[1693795271.374564] [cpu001:167023:0]    ucp_context.c:671  UCX  WARN  network device 'mlx5_0:1' is not available, please use one or more of: 'br0'(tcp), 'ib0'(tcp)
#------------------------------------------------------------
#    Intel (R) MPI Benchmarks 2018, MPI-1 part
#------------------------------------------------------------
# Date                  : Mon Sep  4 10:41:11 2023
# Machine               : x86_64
# System                : Linux
# Release               : 3.10.0-1062.el7.x86_64
# Version               : #1 SMP Wed Aug 7 18:08:02 UTC 2019
# MPI Version           : 3.1
# MPI Thread Environment:


# Calling sequence was:

# ./IMB-MPI1 PingPong

# Minimum message length in bytes:   0
# Maximum message length in bytes:   4194304
#
# MPI_Datatype                   :   MPI_BYTE
# MPI_Datatype for reductions    :   MPI_FLOAT
# MPI_Op                         :   MPI_SUM
#
#

# List of Benchmarks to run:

# PingPong

#---------------------------------------------------
# Benchmarking PingPong
# #processes = 2
#---------------------------------------------------
       #bytes #repetitions      t[usec]   Mbytes/sec
            0         1000         0.23         0.00
            1         1000         0.22         4.48
            2         1000         0.22         9.23
            4         1000         0.22        18.17
            8         1000         0.22        36.50
           16         1000         0.22        72.04
           32         1000         0.27       120.41
           64         1000         0.29       223.25
          128         1000         0.35       361.43
          256         1000         0.43       595.58
          512         1000         0.46      1124.32
         1024         1000         0.61      1678.22
         2048         1000         0.93      2198.88
         4096         1000         1.41      2901.85
         8192         1000         2.56      3194.89
        16384         1000         3.72      4404.63
        32768         1000         5.52      5940.41
        65536          640         8.71      7521.84
       131072          320        14.80      8857.45
       262144          160        13.45     19491.56
       524288           80        29.86     17558.65
      1048576           40        83.04     12627.25
      2097152           20       198.38     10571.51
      4194304           10       418.06     10032.82


# All processes entering MPI_Finalize

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • IB/RDMA如何配合使用?看看走的是TCPIP协议还是需要专门引入包?
  • 如何在我的C++项目中使用ibv_post_send?
  • 如何编译链接
  • ibv_devinfo
  • 如何确定当前节点上,IB库的安装路径?
  • 如何确认自己的MPI程序有没有使用到IB?
  • 如何确定MPICH库有没有使用ib
  • mpiexec -info
  • mpichversion
  • MPI 编译:需要专门配置IB
  • 如何查询IB库的安装位置
  • 驱动查询
  • 安装和使用IB驱动自带的Open MPI高性能计算 HPC用户指南裸金属服务器场景典型应用安装和使用MPI(X86 BMS场景)_华为云
  • 如何在cryomate上使用ib自带的openmpi?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档