Являются ли односторонние чтения RDMA атомарными для отдельных строк кэша?

Моя группа (проект под названием Isis2) экспериментирует с RDMA. Мы озадачены отсутствием документации по гарантиям атомарности односторонних чтений RDMA. Я провел последние полтора часа в поисках какой-либо информации по этому вопросу, но безрезультатно. Это включает в себя внимательное чтение блога на rdmamojo.com, известного тем, что в нем есть ответы на все вопросы RDMA...

В случае, на котором мы сосредоточены, мы хотим, чтобы писатели выполняли атомарную запись для объектов, которые всегда будут помещаться в пределах одной строки кэша. Скажем, это происходит на машине A. Затем мы планируем иметь одностороннее атомарное устройство чтения RDMA на машине B, которое может считывать фрагменты памяти из A, охватывая многие из этих объектов (но опять же, ни один объект никогда не будет записан неатомарно). , и все уместится в какой-то одной строке кэша). Таким образом, B читает X, Y и Z, и каждый из этих объектов находится в одной строке кэша на A и был записан с помощью атомарной записи.

Таким образом, атомарная запись будет локальной, а чтение RDMA будет поступать с удаленных машин и выполняться без участия локального ЦП.

Являются ли наши односторонние чтения «семантически эквивалентными» атомарным локальным чтениям, несмотря на то, что они инициируются на удаленной машине? (Я подозреваю, что да: в противном случае одностороннее чтение RDMA было бы бесполезным для данных, которые когда-либо изменялись...). И где документированы "правила"?


person Ken Birman    schedule 11.11.2015    source источник
comment
В лучшем случае это похоже на конкретную реализацию.   -  person Jason    schedule 12.11.2015


Ответы (3)


Хорошо, тем временем я, кажется, нашел правильный ответ, и я считаю, что ответ Роланда не совсем правильный - отчасти правильный, но не совсем.

В 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 гарантируется только для подмножества памяти. размеры операндов и сценарии выравнивания. Список гарантированных атомарных операций описан в разделе 8.1.1 Руководства разработчика программного обеспечения для архитектуры Intel® IA-32, том 3A.

Затем в разделе, озаглавленном УПРАВЛЕНИЕ НЕСКОЛЬКИМИ ПРОЦЕССОРАМИ, можно найти много информации о гарантированных атомарных операциях (стр. 2210). В частности, Intel гарантирует, что ее подсистемы памяти будут атомарными для нативных типов (битовые, байтовые, целые разного размера, с плавающей запятой). Эти объекты должны быть выровнены так, чтобы они помещались в пределах строки кэша (64 байта на текущих платформах Intel), не пересекая границу строки кэша. Но тогда Intel гарантирует, что независимо от того, какое устройство использует шину памяти, сохранение и выборка будут атомарными.

Для более сложных объектов требуется блокировка, если вы хотите быть уверены, что получите безопасное выполнение. Кроме того, если вы выполняете многоядерные операции, вы должны использовать заблокированные (атомарные) варианты инструкций Intel, чтобы быть уверенными в согласованности для одновременных операций записи. Вы получаете это автоматически для переменных, помеченных как volatile в C++ или C# (также и в Java?).

В целом это означает, что локальные записи в собственные типы могут безопасно сочетаться с удаленно инициированным чтением RDMA.

Но обратите внимание, что строки, байтовые массивы — они не будут атомарными, потому что они могут легко пересечь строку кэша. Кроме того, операции над сложными объектами с более чем одним полем данных могут не быть атомарными — для таких вещей вам потребуется более сложный подход, такой как в статье FaRM (Fast Remote Memory) MSR. Моя собственная потребность проще и не требует сложной схемы нумерации версий, которую реализует FaRM...

person Ken Birman    schedule 12.11.2015

Протокол когерентности кэша, реализованный в контроллере PCIe, должен гарантировать атомарность при чтении одной строки кэша RDMA. Контроллер PCIe должен отслеживать кэши ядер ЦП и брать на себя ответственность за строку кэша (RFO), прежде чем возвращать данные адаптеру RDMA. Таким образом, он должен увидеть снимок строки кэша.

person Anuj Kalia    schedule 22.11.2015

Я не знаю ни одной такой гарантии атомарности. Конечно, операции чтения RDMA выполняются удаленным адаптером, а размер кэш-линии зависит от ЦП. Я не верю, что что-либо гарантирует, что степень детализации операций чтения, используемых удаленным адаптером RDMA, соответствует размеру операций записи, выполняемых удаленным ЦП.

На практике это, вероятно, сработает, поскольку удаленный адаптер, вероятно, выдаст одну транзакцию PCI и т. Д., Но я не думаю, что есть что-то архитектурное, что гарантирует, что вы не получите «разорванные» данные.

person Roland    schedule 12.11.2015