IB(InfiniBand)和 RDMA(Remote Direct Memory Access)是一种高性能网络技术,通常用于加速数据传输。它们不是基于传统的 TCP/IP 协议栈,而是使用自己的协议栈,以实现低延迟、高带宽的数据传输。
IB 和 RDMA 的主要特点包括:
IB 和 RDMA 可以在不同的通信库和框架中使用,如 MPI(Message Passing Interface)和 libfabric。要在程序中使用 IB 和 RDMA,通常需要:
ibv_post_send()
和 ibv_post_recv()
。需要注意的是,IB 和 RDMA 需要专门的硬件支持和网络基础设施。如果要在 IB/RDMA 网络中使用 TCP/IP 协议进行通信,可能需要一些额外的配置和适配。在某些情况下,可能需要在 IB/RDMA 网络上建立 TCP/IP over RDMA(RoCE)通信,以便与传统的 TCP/IP 网络互操作。
综上所述,IB 和 RDMA 是一种高性能的网络技术,可以显著提高数据传输性能,但在使用时需要考虑硬件支持、协议选择和适当的库/框架。
ibv_post_send
是 InfiniBand Verbs 库中的一个函数,用于发送数据操作。以下是在 C++ 项目中使用 ibv_post_send
的基本步骤:
#include <infiniband/verbs.h>
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
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);
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
ibv_post_send
函数发送数据。struct ibv_send_wr *bad_wr;
// Post the Send work request
if (ibv_post_send(qp, &wr, &bad_wr) != 0) {
// Handle error
}
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
}
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 库。编译时可以使用以下步骤:
ibv_post_send
的示例代码保存为 .cpp
文件。g++ -o my_program my_program.cpp -libverbs
在这个命令中,-libverbs
表示链接 InfiniBand Verbs 库。确保您的系统上已经安装了相应的库文件。
如果编译中出现找不到库的错误,您可能需要提供库的路径。例如:
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
load_driver': (.text+0x2be): undefined reference to
dlopen' 错误信息表明在链接时找不到dlopen
函数,这个函数属于libdl
库。您应该在命令行中加入-ldl
来链接这个库。
所以,您的编译命令应更改为:
[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
前缀即可。
这个错误指出libibverbs
试图使用libnl
(Netlink库)的功能,但没有链接到相关的库。libnl
是Linux的一个库,用于内核和用户空间进程之间的通信。
您需要确保已经安装了libnl
,并在编译时链接它。一般情况下,libnl
有三个版本: libnl1
, libnl3
, 和最新版本。您需要查看系统上有哪个版本,并链接对应的版本。
这里是一个通用的例子来链接libnl-3
:
[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上:
sudo apt-get install libnl-3-dev
或在Red Hat/Fedora上:
sudo yum install libnl3-devel
安装后,再次尝试编译并链接。
当然可以,以下是对代码的一些建议和注意事项:
cleanup_ib_resources
函数中也清理dev_list
,使用ibv_free_device_list
。if (dev_list)
{
ibv_free_device_list(dev_list);
}
exit(1)
调用替换为MPI_Abort(MPI_COMM_WORLD, 1)
,这是一个好决策,因为当其中一个进程出现错误时,它确保所有MPI进程都被终止。send_part(data, 1)
)。如果您打算在将来在两个以上的节点上运行代码,您需要相应地进行修改。MPI_Barrier(MPI_COMM_WORLD)
可以确保所有进程同时启动。max_recv_wr
的QP,如果您的应用程序需要,您可能希望同时发布多个接收。但这完全取决于您的应用程序的用例。请记住,将MPI与RDMA(通过verbs)集成并不是直截了当的。正确的RDMA设置需要了解硬件、连接和底层拓扑,并且经常还涉及与交换QP信息、设置连接和管理缓冲区相关的其他设置。所提供的代码只包括基本的verbs操作,并且缺少RDMA的连接设置。
最后,始终在放大之前进行小规模测试。这样,您可以快速识别并纠正问题。
yufande@loginnode test_MPI_info$ ibv_devinfo
hca_id: mlx4_0
transport: InfiniBand (0)
fw_ver: 2.42.5000
node_guid: b859:9f03:009c:65b0
sys_image_guid: b859:9f03:009c:65b3
vendor_id: 0x02c9
vendor_part_id: 4099
hw_ver: 0x1
board_id: DEL1100001019
phys_port_cnt: 1
Device ports:
port: 1
state: PORT_ACTIVE (4)
max_mtu: 4096 (5)
active_mtu: 4096 (5)
sm_lid: 27
port_lid: 28
port_lmc: 0x00
link_layer: InfiniBand
要确定当前节点上 InfiniBand (IB) 库的安装路径,可以执行以下步骤:
which
命令:输入以下命令,以查找 IB 库的安装路径:which ibstat
上述命令将查找 `ibstat` 命令的路径。通常,`ibstat` 命令是 InfiniBand 工具包的一部分,因此可以通过查找其路径来确定 IB 库的安装位置。
rpm
查询(仅适用于基于 RPM 的系统):如果您的系统是基于 RPM 的 Linux 发行版(如 CentOS、Red Hat 等),您可以使用 rpm
命令来查询已安装的软件包信息,以查找 IB 库的安装位置。输入以下命令:rpm -qf `which ibstat`
上述命令将返回包含 `ibstat` 命令的软件包名称。然后,您可以使用 `rpm -ql` 命令来查找该软件包的安装文件列表,以确定 IB 库的位置:
rpm -ql package_name
请将 `package_name` 替换为您在上一步中找到的软件包名称。
find
命令:如果上述方法未能找到 IB 库的安装位置,您可以使用 find
命令来搜索包含 IB 库文件的目录。输入以下命令:sudo find / -name "libibverbs.so"
上述命令将在整个文件系统中搜索名为 `libibverbs.so` 的文件。这是 InfiniBand 库的一部分,因此找到这个文件将帮助您确定 IB 库的安装路径。
请注意,具体的命令和路径可能会根据您的系统配置和安装方式而有所不同。查找 IB 库的确切路径可能需要一些试验和搜索,但上述方法应该帮助您找到所需的信息。
要确定MPI程序是否使用了InfiniBand (IB),您可以采用以下方法:
大多数MPI实现(如OpenMPI、MVAPICH、Intel MPI)都支持多种网络后端。您可以查看其文档或在线资源,以确定默认的网络后端以及如何指定/更改它。
mpirun
**或**mpiexec
**的**--mca
**或**-genv
**参数: 对于OpenMPI,您可以使用`--mca`参数来显示或设置网络后端。例如:
mpirun --mca btl_base_verbose 30 -np 2 ./your_mpi_program
这会在执行过程中显示BTL(Byte Transfer Layer)的详细信息。如果您看到与`openib`相关的输出,那么程序可能正在使用InfiniBand。
对于Intel MPI,您可以使用`-genv`参数来检查或设置网络后端。例如:
mpiexec -genv I_MPI_DEBUG 5 -np 2 ./your_mpi_program
这将显示详细的调试输出,您可以在其中查找与InfiniBand相关的信息。
有时,特定的MPI实现可能会依赖于环境变量来确定网络后端。例如,在OpenMPI中,您可以设置`OMPI_MCA_btl`环境变量来指定网络后端。
查看这些环境变量的当前值可以为您提供关于正在使用的后端的线索。例如:
echo $OMPI_MCA_btl
使用`lsof`或`netstat`等系统工具,您可以观察MPI程序运行时的网络连接。例如,如果您的程序正在使用InfiniBand端口(默认为31415或其他),那么您可能会在`lsof`的输出中看到它。
大多数MPI实现在编译时会决定支持哪些通信接口。例如,对于OpenMPI,您可以查找其配置日志或使用`ompi_info`命令来检查它是否与InfiniBand支持一起编译。
ompi_info | grep openib
如果您看到与`openib`相关的输出,那么OpenMPI已经与InfiniBand支持一起编译。
一种简单但不精确的方法是观察您的程序的性能。InfiniBand通常提供比标准以太网更高的带宽和更低的延迟。因此,如果您的MPI通信性能非常高,那么您可能正在使用InfiniBand。但请注意,这种方法不太可靠,因为许多其他因素也会影响性能。
考虑到MPI的多样性,建议您查看特定MPI实现的文档,以便获取最准确和详细的信息。
要确定MPICH库是否使用了InfiniBand (IB),您可以采用以下方法:
mpichversion
**或**mpiexec
**的输出: 运行`mpichversion`可以显示关于您的MPICH安装的信息。这通常会包括有关配置和编译选项的信息。
mpichversion
或者,您可以使用`mpiexec`来显示调试信息:
mpiexec -info
在这些输出中查找与`ch3:ofi`或`ch3:sock`或`ch3:nemesis`等通道/设备接口相关的信息。`ch3:ofi`接口可能表示MPICH使用了libfabric,这可能意味着它配置为使用InfiniBand。
MPICH通过一系列环境变量来控制其行为。尤其是`MPICH_NETMOD`环境变量可以用来指定或查询网络模块。
查看其值:
echo $MPICH_NETMOD
如果返回值是`ofi`,那么可能正在使用libfabric,这可能意味着它配置为使用InfiniBand。
检查MPICH的编译配置,特别是查看是否启用了InfiniBand支持。如果您有源代码并从源代码构建MPICH,那么您可以查看配置日志。
如果MPICH已安装,您还可以尝试使用`mpicc -show`命令,这将显示用于编译MPI程序的命令。在这些命令中查找与InfiniBand相关的库和头文件。
当您的MPI程序运行时,使用`lsof`或`netstat`等系统工具观察其网络连接。如果您的程序正在使用InfiniBand端口(如31415或其他),那么您可能会在这些工具的输出中看到它。
如果您自己编译了MPICH,那么在配置和编译过程中的输出可能会提供关于是否启用InfiniBand支持的线索。
如果您的MPI通信性能明显高于标准以太网,那么这可能是一个线索,说明您正在使用InfiniBand。然而,这种方法不是特别可靠,因为许多其他因素也可以影响性能。
考虑到MPI库的多样性和配置的复杂性,建议您查看特定MPICH安装的文档或与管理员联系,以获取最准确的信息。
[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
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。因此,要确切知道,您可能需要:
IB
相关的条目。MPICH_NEMESIS_NETMOD
环境变量可能用于指定nemesis
应使用哪个网络子模块。./configure --help
在源代码目录中完成。最后,请注意,只有在您的硬件和操作系统支持InfiniBand,并且已安装了必要的InfiniBand驱动程序和库时,MPICH才能使用InfiniBand。
mpich.org/static/downloads/3.1/mpich-3.1-README.txt
要查询InfiniBand(IB)库的安装位置,您可以尝试以下方法:
dpkg-query -L libibverbs-dev # For Debian/Ubuntu
rpm -ql libibverbs-devel # For Red Hat/CentOS
这些命令将显示与InfiniBand库关联的文件和目录列表,您可以从中找到库的安装位置。
dpkg -l | grep ibverbs # For Debian/Ubuntu
rpm -qa | grep ibverbs # For Red Hat/CentOS
这将显示与InfiniBand相关的安装包列表。然后,您可以根据找到的包名继续使用第一种方法查询安装位置。
请注意,上述命令中的包名可能会根据您的系统和发行版而有所不同。如果您不确定包名,您可以使用类似的关键词进行模糊搜索。
此外,不同的发行版和版本可能会有不同的包管理工具和命令,所以请根据您的系统类型进行相应的操作。
[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
如果您在使用 `rpm -qa | grep mlnx-ofa` 命令时没有找到 InfiniBand(IB)驱动,可能是因为驱动的名称在系统中的注册名称可能与 "mlnx-ofa" 不完全匹配。InfiniBand 驱动的名称在不同版本和不同发行版的 Linux 中可能会有所不同。
在这种情况下,您可以尝试以下方法来查找 IB 驱动的安装信息:
1. 使用 `lsmod` 命令查看内核模块:输入以下命令,以查看已加载的内核模块,这可能包括 IB 驱动模块:
lsmod | grep ib_
这将列出与 InfiniBand 相关的内核模块,并且可能会提供有关驱动的信息。
2. 使用 `modinfo` 命令查看模块信息:您可以使用 `modinfo` 命令查看特定内核模块的详细信息,包括其路径。例如:
modinfo ib_core
上述命令将显示有关 `ib_core` 内核模块的信息,其中可能包括模块的路径。
3. 检查 `/lib/modules` 目录:InfiniBand 驱动通常位于 `/lib/modules` 目录中的一个子目录中。您可以使用 `ls` 命令检查这个目录,以查找可能包含 IB 驱动的子目录。例如:
ls /lib/modules/$(uname -r)/kernel/drivers/infiniband
这将列出与 InfiniBand 驱动相关的文件和目录。您可以进一步探索这些目录以查找驱动文件和信息。
请注意,IB 驱动的名称和组织可能因不同的 Linux 发行版和版本而异。如果上述方法都未能找到 IB 驱动的信息,您可能需要参考您的系统文档或联系系统管理员以获取更多帮助。
- tem00查询
/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)
更新时间:2022-08-29 GMT+08:00
**操作场景**
本节指导用户在BMS上安装和使用IB驱动自带的Open MPI(以版本3.1.0rc2为例)。
对于集群中的每台BMS,都需要执行该操作。
**操作步骤**
1. 查询是否安装了IB驱动。
1. 执行以下命令,查询是否已成功安装IB驱动。
**$ ls /usr/mpi/gcc/openmpi-3.1.0rc2/bin/mpirun**
**$ rpm -qa | grep mlnx-ofa**
**图1** 确认已安装IB驱动
![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133324440.png)
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”。
下载地址:[https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/](https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/)
**图2** IB驱动的下载页面
![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133350636.png)
2. 执行以下命令,安装软件包。
**# yum install tk tcl**
**# tar -xvf MLNX_OFED_LINUX-4.3-1.0.1.0-rhel7.3-x86_64.tgz**
**# cd MLNX_OFED_LINUX-4.3-1.0.1.0-rhel7.3**-x86_64
**# ./mlnxofedinstall**
3. 配置环境变量。
1. 使用vim编辑“~/.bashrc”文件,添加如下配置内容:
**export PATH=$PATH:/usr/mpi/gcc/openmpi-3.1.0rc2**/bin
**export LD_LIBRARY_PATH=/usr/mpi/gcc/openmpi-3.1.0rc2**/lib64
2. 执行以下命令,查看MPI环境变量是否正常。
**$ which mpirun**
**图3** 查看IB驱动自带的Open MPI环境变量
![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133324266.png)
如果回显如[图3](#hpc_04_0008__fig37650618112345)所示,表示环境变量配置成功。
4. 执行以下命令,在单台BMS上运行IB驱动自带的Open MPI。
**$ 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
**图4** 单台BMS上运行Open MPI
![](https://support.huaweicloud.com/usermanual-hpc/zh-cn_image_0133251881.png)
[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
[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 删除。