我是RDMA的新手。现在,我正在学习使用RDMA读/写。如果客户端向服务器发送写/读。客户端如何知道写/读是否成功完成?换句话说,如何知道写入已应用于服务器,以及如何知道数据已从服务器读取。
我在https://github.com/jcxue/RDMA-Tutorial的教程中学习了RDMA。它通过轮询两个内存位置start和end来检测完成。
while ((*msg_start != 'A') && (*msg_end != 'A')) {
}是否只有这种方法才能检测写/读的完成?有没有其他方法不轮询内存中的数据?
谢谢!
发布于 2020-11-30 04:12:09
我无法在您链接的github代码库中找到您所引用的代码,但在任何情况下代码都是不正确的- RDMA适配器可能会以任何顺序将来自RDMA操作的数据写入内存,因此有可能缓冲区的第一个字节和最后一个字节已被填充,但缓冲区的中间部分尚未传输。(尽管在实践中,例如Mellanox适配器确实具有比规范严格要求的更强的排序)
客户端检查RDMA操作是否已完成的正确方法是轮询完成。RDMA操作被提交给发送队列,并且每个发送队列都有一个附加的完成队列(CQ)。当RDMA操作完成时,将生成一个完成并将其添加到该CQ,客户端可以轮询该CQ以查看它是否在那里。
https://stackoverflow.com/questions/65056586
复制相似问题