Существуют ли какие-либо гарантии относительно того, как карта для размещения записи с устройства 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, могу ли я быть уверен, что первая будет воспринята не позже второй?