Являются ли односторонние чтения RDMA атомарными для отдельных строк кэша?
Моя группа (проект под названием Isis2) экспериментирует с RDMA. Мы озадачены отсутствием документации для гарантий атомарности односторонних считываний RDMA. Я провел последние полтора часа в поисках какой-либо информации об этом, но безрезультатно. Это включает в себя внимательное чтение блога на rdmamojo.com, известного тем, что на него есть ответы на все вопросы RDMA...
В том случае, если мы сфокусированы на том, что мы хотим, чтобы писатели делали атомарные записи для объектов, которые всегда помещаются в одной строке кэша. Скажем, это происходит на машине A. Затем мы планируем иметь на машине B односторонний атомарный RDMA-считыватель, который мог бы считывать куски памяти из A, охватывая многие из этих объектов (но, опять же, ни один объект никогда не будет записан неатомно и все уместится в одну строчку кеша). Таким образом, B читает X, Y и Z, и каждый из этих объектов живет в одной строке кэша на A и был записан с атомарной записью.
Таким образом, атомарные записи будут локальными, но чтения RDMA будут поступать с удаленных машин и выполняются без участия локального процессора.
Являются ли наши односторонние чтения "семантически эквивалентными" локальным атомарным чтениям, несмотря на то, что они инициированы на удаленной машине? (Я подозреваю, что так: в противном случае односторонние чтения RDMA были бы бесполезны для данных, которые когда-либо изменялись...). И где задокументированы "правила"?
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, тома 3А.
Затем в этом разделе, озаглавленном "УПРАВЛЕНИЕ НЕСКОЛЬКИМИ ПРОЦЕССАМИ", можно найти много информации о гарантированных атомарных операциях (стр. 2210). В частности, Intel гарантирует, что ее подсистемы памяти будут атомарными для собственных типов (бит, байт, целые числа различных размеров, число с плавающей запятой). Эти объекты должны быть выровнены так, чтобы они помещались в пределах строки кэша (64 байта на текущих платформах Intel), не пересекая границу строки кэша. Но тогда Intel гарантирует, что независимо от того, какое устройство использует шину памяти, хранилища и выборки будут атомарными.
Для более сложных объектов блокировка необходима, если вы хотите быть уверены, что получите безопасное выполнение. Кроме того, если вы выполняете многоядерные операции, вы должны использовать заблокированные (атомарные) варианты инструкций Intel, чтобы быть уверенными в согласованности при одновременной записи. Вы получаете это автоматически для переменных, помеченных как volatile в C++ или C# (Java тоже?).
Это добавляет, что локальные записи в нативные типы могут быть в паре с удаленно инициированными считываниями RDMA.
Но обратите внимание, что строки, байтовые массивы - они не будут атомарными, потому что они могут легко пересечь строку кэша. Кроме того, операции над сложными объектами с более чем одним полем данных могут быть не атомарными - для таких вещей вам понадобится более сложный подход, такой как в документе FaRM (Fast Remote Memory) от MSR. Моя собственная потребность проще и не потребует сложной схемы нумерации версий, которую реализует FaRM...
Протокол когерентности кэша, реализованный в контроллере PCIe, должен гарантировать атомарность для операций чтения RDMA с одной строкой кэша. Контроллер PCIe должен отслеживать кэши ядер ЦП и вступать во владение линией кэша (RFO), прежде чем возвращать данные в адаптер RDMA. Таким образом, он должен увидеть некоторый снимок строки кэша.
Я не знаю ни одной такой гарантии атомности. Конечно, чтения RDMA выполняются удаленным адаптером, а размер кэширования является концепцией ЦП. Я не верю, что что-либо гарантирует, что степень детализации операций чтения, используемых удаленным адаптером RDMA, соответствует размеру операций записи, выполняемых удаленным ЦП.
На практике это может сработать, так как удаленный адаптер, вероятно, выдаст одну транзакцию PCI и т. Д., Но я не думаю, что есть какая-то архитектура, которая гарантирует, что вы не получите "порванные" данные.