5

My group (a project called Isis2) is experimenting with RDMA. We're puzzled by the lack of documentation for the atomicity guarantees of one-sided RDMA reads. I've spent the past hour and a half hunting for any kind of information at all on this to no avail. This includes close reading of the blog at rdmamojo.com, famous for having answers to every RDMA question...

In the case we are focused on, we want to have writers doing atomic writes for objects that will always fit within a single cache line. Say this happens on machine A. Then we plan to have a one-sided atomic RDMA reader on machine B, who might read chunks of memory from A, spanning many of these objects (but again, no object would ever be written non-atomically, and all will fit within some single cache line). So B reads X, Y and Z, and each of those objects lives in one cache line on A, and was written with atomic writes.

Thus the atomic writes will be local, but the RDMA reads will arrive from remote machines and are done with no local CPU involvement.

Are our one-sided reads "semantically equivalent" to atomic local reads despite being initiated on the remote machine? (I suspect so: otherwise, one-sided RDMA reads would be useless for data that is ever modified...). And where are the "rules" documented?

4

3 回答 3

2

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

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf,这是英特尔架构手册(我需要再次检查 AMD...)我发现了这一点:Intel 64 和 IA-32 架构中的原子内存操作仅针对内存操作数大小和对齐方案的子集得到保证。IA-32 英特尔® 架构软件开发人员手册第 3A 卷的第 8.1.1 节描述了保证的原子操作列表。

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

对于更复杂的对象,如果您想确保获得安全执行,则需要锁定。此外,如果您正在执行多核操作,则必须使用 Intel 指令的锁定(原子)变体来确保并发写入的一致性。对于在 C++ 或 C#(Java 也是?)中标记为 volatile 的变量,您会自动获得此信息。

这加起来就是本地写入本地类型可以安全地与远程启动的 RDMA 读取配对。

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

于 2015-11-12T20:56:34.517 回答
1

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

于 2015-11-22T18:42:25.657 回答
0

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

在实践中,它可能会起作用,因为远程适配器可能会发出单个 PCI 事务等,但我认为没有任何架构可以保证您不会得到“撕裂”的数据。

于 2015-11-12T17:17:55.983 回答