Caching 对于单缓存线,单边RDMA读取是原子的吗?

Caching 对于单缓存线,单边RDMA读取是原子的吗?,caching,rdma,isis2,Caching,Rdma,Isis2,我的团队(一个名为Isis2的项目)正在试验RDMA。我们对单边RDMA读取的原子性保证缺乏文档感到困惑。在过去的一个半小时里,我一直在寻找这方面的任何信息,但都没有结果。这包括仔细阅读rdmamojo.com上的博客,该博客以能解答RDMA的每一个问题而闻名 在我们关注的案例中,我们希望让编写器对始终适合单个缓存线的对象执行原子写入。假设这种情况发生在机器A上。然后我们计划在机器B上有一个单面原子RDMA读取器,它可以从A中读取内存块,跨越许多对象(但同样,没有对象会以非原子方式写入,并且所有

我的团队(一个名为Isis2的项目)正在试验RDMA。我们对单边RDMA读取的原子性保证缺乏文档感到困惑。在过去的一个半小时里,我一直在寻找这方面的任何信息,但都没有结果。这包括仔细阅读rdmamojo.com上的博客,该博客以能解答RDMA的每一个问题而闻名

在我们关注的案例中,我们希望让编写器对始终适合单个缓存线的对象执行原子写入。假设这种情况发生在机器A上。然后我们计划在机器B上有一个单面原子RDMA读取器,它可以从A中读取内存块,跨越许多对象(但同样,没有对象会以非原子方式写入,并且所有对象都可以放在某个缓存线中)。所以B读取X、Y和Z,而这些对象中的每一个都位于A的一条缓存线中,并且是用原子写入的

因此,原子写入将是本地的,但是RDMA读取将从远程机器到达,并且在没有本地CPU参与的情况下完成


尽管是在远程机器上启动的,我们的单边读取是否与原子本地读取“语义等价”?(我怀疑是这样的:否则,单边RDMA读取对于任何修改过的数据都是无用的…)。“规则”记录在哪里?

我不知道有任何原子性的保证。当然,RDMA读取是由远程适配器执行的,缓存线大小是CPU的概念。我不相信任何东西可以确保远程RDMA适配器使用的读取粒度与远程CPU执行的写入大小相匹配


实际上,它可能会工作,因为远程适配器可能会发出单个PCI事务等。但我不认为有任何体系结构可以保证您不会得到“撕裂”数据。

好的,同时我似乎找到了正确的答案,我相信罗兰的回答并不完全正确——部分正确,但并非完全正确

在中,这是英特尔体系结构手册(我需要再次检查AMD…),我发现:英特尔64和IA-32体系结构中的原子内存操作仅保证内存操作数的子集 大小和对齐方案。IA-32第8.1.1节描述了保证的原子操作列表 英特尔体系结构软件开发人员手册,第3A卷

然后在这一节中,题为“多处理器管理”,我们可以找到许多关于保证原子操作的信息(第2210页)。特别是,英特尔保证其内存子系统对于本机类型(位、字节、各种大小的整数、浮点)是原子的。这些对象必须对齐,以适应缓存线(当前英特尔平台上为64字节),而不跨越缓存线边界。但是英特尔保证,无论什么设备使用内存总线,存储和获取都是原子的

对于更复杂的对象,如果希望确保安全执行,则需要锁定。此外,如果要执行多核操作,则必须使用英特尔指令的锁定(原子)变体,以确保并发写入的一致性。你可以自动得到变量,这些变量在C++或C语言中是易失性的(java也?)。p> 这意味着对本机类型的本地写入可以与远程启动的RDMA读取安全地配对


但请注意,字符串、字节数组——它们不是原子的,因为它们很容易跨越缓存线。此外,对具有多个数据字段的复杂对象的操作可能不是原子操作——对于这些操作,您需要一种更复杂的方法,例如MSR的FaRM paper(快速远程内存)中的方法。我自己的需求更简单,不需要复杂的版本编号方案农场实现…

PCIe控制器中实现的缓存一致性协议应保证单缓存线RDMA读取的原子性。在将数据返回到RDMA适配器之前,PCIe控制器必须窥探CPU内核的缓存并获得缓存线(RFO)的所有权。因此,它应该看到缓存线的一些快照。

充其量,它似乎是一个实现。