有人可以通过infiniband解释IPoIB和TCP的概念吗?我理解本地infiniband提供的整体概念和数据速率,但不太了解TCP和IPoIB如何适应.为什么你需要它们,他们做了什么?有人说他们的网络使用IPoIB或TCP与infiniband有什么区别?哪一个更好?我不是来自强大的网络背景,所以如果你能详细说明那就太好了.
谢谢您的帮助.
我喜欢InfiniBand承诺的40Gbit/s网络.我的需求没有映射到具有一个核心节点+从属的MPI模型,如果可能,我宁愿不使用MPI.我需要简单的连接/发送/接收/关闭(或其异步版本)API.然而,在MS Azure文档和 Microsoft HPC Pack文档中,我无法找到任何可以使用InfiniBand作为我的应用程序传输的C/C++或.Net API.所以我的问题很简单,如何使用InfiniBand连接到其他节点并向其发送数据包并在另一端接收?(类似于一些Socket API或类似的东西)
Azure上的ND-SPI或Azure上的DAPL-ND 连接/发送/接收/关闭教程是我正在寻找的.
我正在写一个多线程的openmpi应用程序,使用MPI_Isend和MPI_Irecv从多个线程在InfiniBand RDMA队伍之间交换每秒数百个消息.
传输大约为400-800KByte,每个等级产生大约9Gbps的输入和输出,完全在FDR的容量范围内.简单的MPI基准测试也表现出良好的性能.
通过在专用线程中使用MPI_Testsome轮询所有活动传输来检查传输的完成.
我实现的传输速率取决于消息速率,但更重要的是取决于MPI_Testsome的轮询频率.也就是说,如果我每隔10毫秒轮询一次,请求的结束时间比我每1毫秒轮询一次.
我希望如果我轮换10ms而不是每1ms,我最多会在9ms之后被告知已完成的请求.我不希望传输本身通过减少对MPI_Testsome的调用来延迟完成,从而减慢总传输速率.我希望MPI_Testsome完全被动.
这里的任何人都知道为什么会出现这种情况?
我有一些由Infiniband网络连接的多核计算机.我希望在共享内存池上进行一些低延迟计算,并进行远程原子操作.我知道RDMA是要走的路.在每个节点上,我将注册一个内存区域(和保护域)以进行数据共享.
在线RDMA示例通常关注单线程服务器和单线程客户端之间的单个连接.现在,我希望在每个Infiniband节点上都有一个多线程进程.我对以下内容感到非常困惑......
对于n个节点和m个线程的集群,我应该在每个节点上准备多少个队列对?更具体地说,同一节点上的多个线程可以共享同一个队列对吗?
我应该在每个节点上准备多少个完成队列?我将在每个节点上有多个线程发出远程读/写/ cas操作.如果他们要共享一个公共完成队列,则完成事件将被混淆.如果线程有自己独立的完成队列,那么它们确实会有很多.
你建议我有任何现有的库而不是编写这个软件吗?(嗯,或者我应该写一个并开源吗?:-)
谢谢你的善意建议.
我正在尝试在这里构建和运行RDMA示例.但是因为我正在探索,我没有任何能够管理RDMA的硬件.当我尝试运行示例代码时,我收到这样的错误.
librdmacm: couldn't read ABI version.
librdmacm: assuming: 4
CMA: unable to get RDMA device list
error: ec = rdma_create_event_channel() failed (returned zero/null).
Run Code Online (Sandbox Code Playgroud)
是否有可用于开发的RDMA功能的"本地"实现?我知道RDMA中的"R"意味着远程,但我认为这可能存在用于测试/开发目的.
作为参考,我的Ubuntu 14.04箱尝试这个已经安装的软件包libibverbs-dev,并librdmacm-dev为了让代码编译.
我有一个具有高性能网络的集群(InfiniBand).但是,当我设置我的Dask调度程序和工作程序时,性能似乎并不像我预期的那么快.我怎么能告诉Dask使用这个网络?
免责声明:我只是问这个问题,以便我可以回答.它已成为一个经常被问到的问题
我有两台机器,一台客户机和一台服务器,与Infiniband连接.服务器机器有一个NVIDIA Fermi GPU,但客户端机器没有GPU.我有一个在GPU机器上运行的应用程序,它使用GPU进行一些计算.GPU上的结果数据从不被服务器机器使用,而是直接发送到客户端机器而无需任何处理.现在我正在做一个cudaMemcpy从GPU获取数据到服务器的系统内存,然后通过套接字将其发送到客户端.我正在使用SDP为此通信启用RDMA.
在这种情况下,我是否可以利用NVIDIA的GPUDirect技术来摆脱cudaMemcpy呼叫?我相信我已正确安装了GPUDirect驱动程序,但我不知道如何在不先将其复制到主机的情况下启动数据传输.
我的猜测是不可能将SDP与GPUDirect结合使用,但还有其他方法可以启动从服务器机器GPU到客户机的RDMA数据传输吗?
额外:如果somone有一个简单的方法来测试我是否正确安装了GPUDirect依赖项,这也是有帮助的!
Linux中有没有像tcpdump这样的实用程序来捕获流经RDMA通道的流量?(Infiniband的/ ROCE /的iWARP)
在大量内核上调试我的程序,我遇到了非常奇怪的错误insufficient virtual memory.我的调查导致代码的和平,主机向每个从机发送小消息.然后我写了一个小程序,其中1个master只发送10个整数,MPI_SEND所有从属接收它MPI_RECV./proc/self/status前后文件的比较MPI_SEND表明,内存大小之间的差异是巨大的!最有趣的事情(崩溃我的程序)是,这个内存不会释放后MPI_Send仍然占用大量空间.
有任何想法吗?
System memory usage before MPI_Send, rank: 0
Name: test_send_size
State: R (running)
Pid: 7825
Groups: 2840
VmPeak: 251400 kB
VmSize: 186628 kB
VmLck: 72 kB
VmHWM: 4068 kB
VmRSS: 4068 kB
VmData: 71076 kB
VmStk: 92 kB
VmExe: 604 kB
VmLib: 6588 kB
VmPTE: 148 kB
VmSwap: 0 kB
Threads: 3
System memory usage after MPI_Send, rank 0
Name: test_send_size
State: R (running)
Pid: …Run Code Online (Sandbox Code Playgroud) 我正在编写一个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)