Обрабатывает ли clwb буфер записи в хранилище?
В руководстве по программному обеспечению Intel сказано, что clwb: "Записывает обратно в память строку кэша (если она изменена), которая содержит линейный адрес, указанный с помощью операнда памяти, с любого уровня иерархии кеша в домене согласованности кэша. Строка может сохраняться в иерархии кеша в немодифицированное состояние. clwb упорядочивается по отношению к более старым операциям записи в строку кэша, которая записывается обратно"
Мой вопрос: в приведенном ниже псевдокоде
write(A)
clwb (A)
Обрабатывает ли clwb буфер записи в хранилище? или мне нужно sfence после записи, перед использованием clwb, например
write (A)
sfence
clwb (A)
Я хочу знать, действительно ли требуется "sfence"? Благодарность
2 ответа
На процессорах Intel
clwb
инструкция упорядочена по отношению к более старым операциям записи в ту же строку кэша. На процессорах AMD, согласно разделу 7.6.3 тома 2 руководства AMD № 24593,
clwb
инструкция упорядочена по отношению к более старым операциям записи в ту же строку кэша, если тип памяти целевого адреса является типом кэшируемой памяти (например, WB, WT или WP) во время выполнения
clwb
инструкция.
Эта гарантия упорядочения означает, что самое последнее состояние строки или более позднее состояние по отношению к порядку программы в конечном итоге будет записано обратно, если необходимо, в домен сохранения в какой-то момент времени после вывода из эксплуатации
clwb
инструкция. Обратите внимание, что домен сохранения определяется платформой.
Вот мой ответ на последующий вопрос: Означает ли это, что если у меня один поток выполнения, то правильность операций «store A, clwb(A), store B, clwb(B)» поддерживается без использования sfence на Intel X86-64, поскольку TSO гарантирует, что магазин (A) для хранения (B) заказан, а clwb(A) заказан в магазине (A), а clwb(B) заказан в магазине (B)
Инструкции clwb не упорядочиваются друг с другом, если они сбрасывают разные строки кэша. TSO гарантирует только то, что хранилища удаляются в программном порядке (т. Е. Запись в кэш выполняется в программном порядке). Итак, в вашем примере в иерархии кеша хранилище A всегда завершается перед хранилищем B, но хранилище B может достигать памяти (энергозависимой или энергонезависимой) до хранилища A. Если вы хотите сохранить только порядок обратной записи в кеше иерархия, никакой защиты не требуется.
Но если вам нужно гарантировать, что хранилище A всегда достигает памяти перед хранилищем B, вам нужно вставить границу между clwb(A) и store (B).