Ken*_*man 5 caching rdma isis2
我的小组(一个名为 Isis2 的项目)正在试验 RDMA。我们对缺乏单方面 RDMA 读取的原子性保证的文档感到困惑。在过去的一个半小时里,我一直在寻找有关这方面的任何信息,但无济于事。这包括仔细阅读 rdmamojo.com 上的博客,该博客以回答每个 RDMA 问题而闻名......
在我们关注的情况下,我们希望编写器对始终适合单个缓存行的对象进行原子写入。假设这发生在机器 A 上。然后我们计划在机器 B 上有一个单边原子 RDMA 读取器,它可以从 A 读取大块内存,跨越许多这些对象(但同样,没有对象会被非原子地写入,并且所有内容都将适合某个单个缓存行)。因此 B 读取 X、Y 和 Z,并且这些对象中的每一个都位于 A 上的一个缓存行中,并使用原子写入进行写入。
因此,原子写入将是本地的,但 RDMA 读取将从远程机器到达,并且在没有本地 CPU 参与的情况下完成。
尽管是在远程机器上启动的,我们的单边读取是否与原子本地读取“语义等效”?(我怀疑是这样:否则,单边 RDMA 读取对于曾经修改过的数据将毫无用处......)。“规则”记录在哪里?
好吧,同时我似乎已经找到了正确的答案,而且我相信罗兰的回答并不完全正确——部分正确但不完全正确。
\n\n在http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf中,这是Intel架构手册(我需要再次检查 AMD...)我发现:Intel 64 和 IA-32 架构中的原子内存操作仅保证内存操作数大小和对齐方案的子集。保证的原子操作列表在 IA-32\nIntel\xc2\xae Architecture Software Developer\xe2\x80\x99s 手册第 3A 卷第 8.1.1 节中进行了描述。
\n\n然后,在标题为“多处理器管理”的部分中,人们可以找到大量有关保证原子操作的信息(第 2210 页)。特别是,英特尔保证其内存子系统对于本机类型(位、字节、各种大小的整数、浮点数)来说将是原子的。这些对象必须对齐,以便适合高速缓存行(当前 Intel 平台上为 64 字节),而不跨越高速缓存行边界。但英特尔保证,无论什么设备使用内存总线,存储和读取都将是原子的。
\n\n对于更复杂的对象,如果您想确保安全执行,则需要锁定。此外,如果您正在进行多核操作,则必须使用英特尔指令的锁定(原子)变体,以确保并发写入的一致性。对于 C++ 或 C# 中标记为 volatile 的变量(Java 也是如此?),您会自动获得此值。
\n\n这意味着对本机类型的本地写入可以与远程启动的 RDMA 读取安全地配对。
\n\n但请注意,字符串、字节数组——这些都不是原子的,因为它们很容易跨越缓存行。此外,对具有多个数据字段的复杂对象的操作可能不是原子的 - 对于此类事情,您需要一种更复杂的方法,例如 MSR 的 FaRM 论文(快速远程内存)中的方法。我自己的需求更简单,不需要 FaRM 实现的复杂版本编号方案......
\n| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |