我正在编写一个RDMA(InfiniBand)内核模块.
到目前为止,我已成功创建保护域,发送和接收队列的完成队列.
但每当我尝试通过调用ib_create_qp来创建队列对时,它都无法创建队列对.我写的代码如下所示:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/err.h>
#include "myClient.h"
struct workqueue_struct *myClient_workqueue;
struct ib_sa_client myClient_sa_client;
/*
static void myClient_add_one(struct ib_device *device);
static void myClient_remove_one(struct ib_device *device);
*/
struct ib_pd *mypd;
struct ib_cq *myrcvcq;
struct ib_cq *myClientsendcq;
struct ib_qp *myClientqp;
void myClient_ib_recvcompletion(struct ib_cq *cq)
{
printk("A user-specified callback that is invoked when a completion event occurs on the CQ.\n");
}
void myClient_ib_sendcompletion(struct ib_cq *cq)
{
printk("A user-specified callback that is invoked when a …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用 infiniband 基础设施将数据流从服务器发送到另一个服务器。我过去习惯通过 infiniband 轻松开发 ip,因为我更熟悉套接字编程。到目前为止,性能(最大带宽)对我来说已经足够好了(我知道我没有获得可实现的最大带宽),现在我需要从无限带宽连接中获得更多带宽。
ib_write_bw 声称我的最大可实现带宽约为 1500 MB/s(我没有得到 3000MB/s,因为我的卡安装在 PCI 2.0 8x 中)。
到现在为止还挺好。我使用 ibverbs 和 rdma 对我的通信通道进行了编码,但我得到的带宽远远低于我可以获得的带宽,我什至获得的带宽比使用套接字少一点,但至少我的应用程序不使用任何 CPU 功率:
ib_write_bw:1500 MB/s
套接字:700 MB/s <= 在此测试期间,我的系统的一个核心处于 100%
ibvers+rdma: 600 MB/s <= 在这个测试过程中根本没有使用 CPU
看来瓶颈就在这里:
ibv_sge sge;
sge.addr = (uintptr_t)memory_to_transfer;
sge.length = memory_to_transfer_size;
sge.lkey = memory_to_transfer_mr->lkey;
ibv_send_wr wr;
memset(&wr, 0, sizeof(wr));
wr.wr_id = 0;
wr.opcode = IBV_WR_RDMA_WRITE;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
wr.wr.rdma.remote_addr = (uintptr_t)thePeerMemoryRegion.addr;
wr.wr.rdma.rkey = thePeerMemoryRegion.rkey;
ibv_send_wr *bad_wr = NULL;
if (ibv_post_send(theCommunicationIdentifier->qp, &wr, …Run Code Online (Sandbox Code Playgroud) 以下是一些细节.
当一个进程调用时ibv_post_send(),在HCA的PCI接口上会发生什么?WQE是否封装在PCIe门铃内并通过Programmed IO写入?或者WQE是否由HCA单独读取?
当进程调用时会发生什么ibv_poll_cq()?HCA如何将CQE推送到系统内存?或者,如果它是基于拉力的,那么CPU如何在HCA中检测新的CQE?
我试图在具有infiniband互连的HPC聚焦集群中使用Spark.此群集不提供支持IPoIB.我在这里看到了俄亥俄州立大学的Spakr-RDMA项目.我找不到其他人在做这个,或者apache spark将来会支持IB.问题是,是否有其他解决方案可以在只有IB作为网络的HPC环境中获得更新版本的spark?
我试图在c ++中创建一个小型服务器,它只会回应通过infiniband连接收到的任何内容.我也在Ubuntu下使用套接字直接协议和POSIX套接字.
不幸的是,我在互联网上找到的唯一建议是关于如何使用AF_INET_SDP域创建套接字,就像这里:
#define AF_INET_SDP 27
int socketfd = socket(AF_INET_SDP, SOCK_STREAM, 0);
Run Code Online (Sandbox Code Playgroud)
我设法绑定套接字,我调用listen(...)函数但服务器在尝试接受连接时挂起,而在客户端我只在尝试连接时收到超时.
我还有一个用Java编写的旧的类似应用程序(客户端和服务器)通过infiniband进行通信,它可以正常工作.
有人可以给我一个使用infiniband的应用程序示例,还是指向某些可以帮助我的文档?
谢谢.
我有两台机器.每台机器上都有多张特斯拉卡.每台机器上都有一张InfiniBand卡.我想通过InfiniBand在不同机器上的GPU卡之间进行通信.只需点对点单播即可.我当然希望使用GPUDirect RDMA,这样我就可以省去额外的复制操作.
我知道Mellanox现在有一款可用于其InfiniBand卡的驱动程序.但它没有提供详细的开发指南.另外我知道OpenMPI支持我要求的功能.但OpenMPI对于这个简单的任务来说太重了,它不支持单个进程中的多个GPU.
我想知道我是否可以直接使用驱动程序进行通信.代码示例,教程,任何事情都会很好.此外,如果有人能帮助我在OpenMPI中找到处理此问题的代码,我将不胜感激.
我正在尝试在具有MXM Infiniband网络(40 Gbps,型号:Mellanox Technologies MT26428)的群集上运行多列Chapel代码.
我按照Chapel和GASNet文件进行了跟踪,并设置了
export CHPL_COMM_SUBSTRATE=ibv
export CHPL_LAUNCHER=gasnetrun_ibv
export GASNET_IBV_SPAWNER=mpi
CHPL_COMM_SUBSTRATE=mxm一旦mxm被弃用,而不是使用.
问题是我可以使用ibv基板构建Chapel.但是,我不能在多个语言环境中运行.我收到大量的超时错误.
首先,我认为问题是PKEY.所以,我加入"--mca btl_openib_pkey "0x8100""了MPIRUN_CMD.但是,没有成功.
我还尝试使用不推荐使用的mxm配置:
CHPL_LAUNCHER=gasnetrun_mxm
export CHPL_LAUNCHER=gasnetrun_ibv
export GASNET_MXM_SPAWNER=mpi
但是,我无法使用这样的配置构建Chapel.这是错误信息:
"User requested --enable-mxm, but I don't know how to build mxm programs for your system."
顺便说一句,在没有分区键的情况下在MPI,UDP和Infiniband之上使用GASNET可以正常工作.
有人知道如何在配备MXM Infiniband网络和分区密钥(PKEY)的群集上使用Chapel吗?
最好的祝福,
蒂亚戈卡内罗.
我对 JSOR 和 jVerbs 都有基本的了解。
两者都处理 JNI 的限制并使用快速路径来减少延迟。它们都使用用户 Verbs RDMA 接口来避免上下文切换并提供快速路径访问。两者都有零拷贝传输选项。
不同的是,JSOR 仍然使用 Java Socket 接口。jVerbs 提供了一个新界面。jVerbs 也有一种叫做 Stateful Verbs Call 的东西,以避免重复序列化 RDMA 请求,他们说这可以减少延迟。jVerbs 提供了更原生的接口,应用程序可以直接使用这些接口。我阅读了 jVerbs SoCC 2013 论文,其中他们在 jVerbs 之上构建 jverbsRPC 并表明它显着减少了 zookeeper 和 memcache 操作的延迟。
两者的文档表明,它们的性能优于基于 TCP/IP、SDP 和 IPoIB 的常规 Java 套接字。
我没有 JSOR 和 jVerbs 之间的任何性能比较。我认为 jVerbs 可能比 JSOR 表现得更好。但是,使用 JSOR,我不必更改现有代码,因为它仍然使用相同的 Java 套接字接口。我的问题是使用 jVerbs 相对于 JSOR 的性能提升可能是什么。有没有人知道或有处理这两者的经验?如果您有任何比较数据,那就太好了。我找不到任何。
infiniband ×10
rdma ×4
linux ×2
apache-spark ×1
c++ ×1
chapel ×1
cuda ×1
gasnet ×1
gpudirect ×1
hpc ×1
java ×1
linux-kernel ×1
ofed ×1
openmpi ×1
pci ×1
pci-e ×1
performance ×1
posix ×1
sockets ×1
ubuntu ×1