我的小组(一个名为Isis2的项目)正在试验RDMA。我们对缺乏对单向RDMA读取原子性保证的文档感到困惑。在过去的一个半小时里,我一直在搜寻这方面的任何信息,但都没有结果。这包括仔细阅读rdmamojo.com的博客,著名的答案是每个RDMA问题.
在我们关注的情况下,我们希望让编写人员为始终适合在单个缓存行中的对象执行原子写入。假设这发生在机器A上,那么我们计划在机器B上有一个单边的原子RDMA读取器,该读取器可以从A读取内存块,跨越许多这些对象(但同样,没有任何对象是非原子编写的,而且所有对象都将适合于某个单一的缓存行)。所以B读取X,Y和Z,每个对象都生活在A上的一个缓存行中,并且是用原子写写的。
因此,原子写入将是本地的,但RDMA读取将从远程计算机到达,并且在不涉及本地CPU的情况下完成。
尽管是在远程机器上启动的,我们的单方面读取是否“在语义上等同于原子本地读取”?(我怀疑是这样的:否则,单方面的RDMA读取对于任何修改过的数据都是无用的.)“规则”在哪里被记录下来?
发布于 2015-11-12 20:56:34
好的,与此同时,我似乎找到了正确的答案,我相信罗兰的回答并不完全正确--部分正确,但不完全正确。
在http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf中,这是英特尔的架构手册(我需要再次检查一下.)我发现: Intel 64和IA-32体系结构中的原子内存操作仅为内存操作数大小和对齐场景的子集提供了保证。保证原子操作的列表在IA-32 Intel架构软件开发人员手册第8.1.1节中进行了描述,第3A卷。
然后,在题为“多处理器管理”的那一节中,人们发现了许多关于保证原子操作的信息(第2210页)。特别是,Intel保证其内存子系统对于本机类型(位、字节、各种大小的整数、浮点)都是原子的。这些对象必须对齐以适应高速缓存线(当前Intel平台上的64字节),而不是跨越缓存线边界。但英特尔保证,无论哪种设备使用内存总线,存储和获取都将是原子的。
对于更复杂的对象,如果要确保获得安全执行,则需要锁定。此外,如果您正在执行多核操作,则必须使用Intel指令的锁定(原子)变体,以确保并发写入的一致性。对于在C++或C#中标记为易失性的变量,您会自动获得这个值(Java?)。
这意味着对本机类型的本地写入可以与远程启动的RDMA读取安全地配对。
但是请注意,字符串、字节数组--它们不会是原子的,因为它们很容易跨越缓存线。此外,对包含多个数据字段的复杂对象的操作可能不是原子操作--为此,您需要一种更复杂的方法,例如MSR在FaRM文档(快速远程内存)中的操作。我自己的需求更简单,不需要详细的版本编号方案FaRM实现.
发布于 2015-11-22 18:42:25
在PCIe控制器中实现的缓存一致性协议应该保证单个缓存行RDMA读取的原子性。PCIe控制器必须窥探CPU核心的缓存并在将数据返回给RDMA适配器之前获取缓存线的所有权。因此,它应该看到缓存行的一些快照。
发布于 2015-11-12 17:17:55
我不知道有任何这样的原子性保证。当然,RDMA读取是由远程适配器执行的,而cacheline大小是CPU概念。我认为没有什么能确保远程RDMA适配器使用的读取粒度与远程CPU执行的写入大小相匹配。
在实践中,它可能会起作用,因为远程适配器可能会发出单个PCI事务等等,但我认为没有任何体系结构可以保证您不会被“撕毁”数据。
https://stackoverflow.com/questions/33651910
复制相似问题