Семантика размещения/видимости данных для чтения и записи RDMA

#rdma #gpudirect

Вопрос:

Я пытаюсь получить более подробную информацию о семантике чтения и записи RDMA (особенно о семантике размещения данных), и я хотел бы подтвердить свое понимание с экспертами здесь.

  1. RDMA прочитал :

Будут ли данные доступны/видны в локальном буфере, как только завершение чтения RDMA будет замечено в очереди завершения. Является ли поведение таким же, если я использую GPU Direct DMA и локальные адреса сопоставляются с памятью GPU. Будут ли данные немедленно доступны в графическом процессоре, как только завершение чтения RDMA будет замечено в очереди завершения. Если он не доступен немедленно, какая операция позволит его обеспечить.

  1. Запись RDMA с немедленной (или) записью RDMA отправкой:

Может ли удаленный хост проверить наличие данных в своей памяти после того, как он увидел непосредственные данные в очереди приема. И изменится ли ожидание/поведение, если запись выполняется в память GPU (с использованием GDR).

Ответ №1:

РДМА прочитал. Будут ли данные доступны/видны в локальном буфере, как только завершение чтения RDMA будет замечено в очереди завершения?

ДА

Такое же ли поведение, если я использую GPU Direct DMA и локальные адреса сопоставляются с памятью GPU?

Необязательно. Возможно, сетевой адаптер отправил данные в графический процессор, но графический процессор еще не получил их. Тем временем завершение чтения RDMA уже поступило на центральный процессор. Основной причиной этого является семантика PCIe, которая позволяет переупорядочивать записи в другое место назначения (память CPU/GPU).

Если он не будет доступен немедленно, какая операция позволит его обеспечить?

Чтобы убедиться, что данные поступили на графический процессор, можно установить флаг на процессоре после завершения RDMA и опросить этот флаг из кода графического процессора. Это работает, потому что чтение PCIe, выданное графическим процессором, «подтолкнет» DMA-записи NIC (в соответствии с семантикой упорядочения PCIe).

Запись RDMA с немедленной (или) записью RDMA отправкой: Может ли удаленный хост проверить наличие данных в своей памяти после того, как он увидел немедленные данные в очереди приема. И изменится ли ожидание/поведение, если запись выполняется в память GPU (с использованием GDR).

Да, это работает, но GDR страдает от той же проблемы, что и выше, когда записи поступают не по порядку в память GPU по сравнению с памятью процессора, опять же из-за семантики упорядочения PCIe. RNIC не может контролировать PCIe и, следовательно, не может принудительно использовать «желаемую» семантику в любом случае.

Комментарии:

1. Спасибо. Одно сомнение. >Чтобы убедиться, что данные поступили на графический процессор, можно установить флаг на процессоре после завершения RDMA и опросить этот флаг из кода графического процессора. Рассмотрим нижеприведенную последовательность. 1) Начато чтение RDMA. 2) Опрос флага с графического процессора 3) Завершение RDMA достигает процессора. 4) Процессор устанавливает флаг. 5) Графический процессор видит флаг.. Я понимаю, что чтение PCIe приведет к удалению всех предыдущих записей DMA, но если и до тех пор, пока вы не начнете опрос GPU только после завершения RDMA, это может сработать. В противном случае всегда возникает проблема со временем, когда это может не сработать. Правильно ли это понимание ?

2. Это зависит. В приведенном выше объяснении я предположил, что память на процессоре равна нулю, и поэтому опрос будет генерировать флаг только при поступлении данных. Очевидно, что необходимо позаботиться о том, чтобы это действительно имело место.