Атомарность малых P CIE TLP пишет - PullRequest
1 голос
/ 27 мая 2020

Существуют ли какие-либо гарантии относительно того, как карта для размещения записи с устройства P CIe, нацеленного на обычную память, реализована с точки зрения программного процесса, когда одна запись TLP полностью содержится в одной строке кэша ЦП ?

Меня интересует случай, когда мое устройство может записать некоторое количество слов данных с последующим байтом, чтобы указать, что структура теперь действительна (например, завершение события), например:

struct PCIE_COMPLETION_T {
    uint64_t  data_a;
    uint64_t  data_b;
    uint64_t  data_c;
    uint64_t  data_d;
    uint8_t   valid;
} alignas(SYSTEM_CACHE_LINE_SIZE);

Могу ли я использовать один TLP для записи этой структуры, чтобы, когда программное обеспечение видит, что действительный член изменяется на 1 (который был предварительно очищен до нуля программным обеспечением), тогда другие члены данных также будут отражать значения, которые я написал, а не предыдущее значение?

В настоящее время я выполняю 2 записи, сначала записываю данные, а затем помечаю их как действительные, что не имеет никаких явных условий гонки, но, конечно, добавляет нежелательные накладные расходы.

Наиболее актуальный вопрос, который я вижу на этом сайте, кажется be Выполняется запись на шину P CIe atomi c? , хотя это, по-видимому, связано с относительным упорядочением TLP.

Просмотр P CIe 3.0, я не нашел ничего, что явно отражало бы мои опасения, я не думаю, что мне особенно нужен AtomicOps. Учитывая, что меня беспокоит только взаимодействие с системами x86-64, я также покопался в руководстве по архитектуре Intel, но не нашел более ясного.

Инстинктивно кажется, что такая запись должна быть воспринимается атомарно - особенно потому, что это транзакция, - но в равной степени я не могу найти много документации, явно подтверждающей это представление (и я не совсем уверен, что мне нужно посмотреть, возможно, процессор продавец?). Мне также интересно, можно ли распространить такую ​​схему на несколько строк кэша - ie, если действительный находится на второй строке кэша, записанной из той же транзакции TLP, могу ли я быть уверен, что первая будет воспринята не позже второй?

1 Ответ

1 голос
/ 27 мая 2020

Запись может быть разбита на более мелкие единицы, такие как dwords, но если это так, они должны соблюдаться в порядке возрастания адресов.

P CIe версия 4, раздел 2.4. 3:

Если одна транзакция записи, содержащая несколько DW и сброс бита ослабленного упорядочивания, принимается Completer, наблюдаемое упорядочение обновлений в местах в буфере данных Completer должно быть в порядке возрастания адресов . Этот семанти c требуется в случае, если мост PCI или PCI-X на пути объединяет несколько транзакций записи в одну. Однако наблюдаемая степень детализации обновлений буфера данных Completer выходит за рамки данной спецификации.

Хотя это и не требуется данной спецификацией, настоятельно рекомендуется, чтобы хост-платформы гарантировали, что при записи PCI Express обновляет память хоста, гранулярность обновления, наблюдаемая центральным процессором, не будет меньше, чем DW.

В качестве примера порядка обновления и гранулярности, если запрашивающий записывает QW в память хоста, в некоторых случаях хост ЦП, считывающий эту QW из памяти хоста, может наблюдать, как первый DW обновлен, а второй DW содержит старое значение.

У меня нет копии версии 3, но я подозреваю, что этот язык находится на этом доработка тоже. Чтобы помочь вам найти его, раздел 2.4 - «Порядок транзакций», а раздел 2.4.3 - «Порядок обновления и степень детализации, обеспечиваемые транзакцией записи».

...