Нужно ли программировать сбрасывать записи памяти в явном виде?

Я знаю, что записи в комбинат записываются в кеш и не достигают памяти напрямую. Но нужно ли программисту явно очистить эту память, прежде чем другие смогут получить к ней доступ?

Я получил этот вопрос из кода графического драйвера. Например, CPU заполняет буфер вершин (отображается как WC). Но до того, как GPU получит к нему доступ, я не вижу операции очистки в коде. Архитектура (x86) уже позаботилась об этом для нас? Есть более подробный документ об этом?

1 ответ

Решение

В соответствии с Руководством разработчика программного обеспечения Intel® 64 и IA-32, Том 3А: Руководство по системному программированию, Часть 1 (версия августа 2012 г., но это не должно было измениться), Раздел 11.3.1, буфер должен быть очищен:

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

Если графические драйверы на самом деле не сбрасывали буферы объединения записи, то они зависели от системной синхронизации и / или размеров буфера (при условии, что последующие записи WC будут выделены для буфера, это архитектурно не гарантируется). Это может работать (или, кажется, работать) в существующих системах при обычных рабочих нагрузках, но архитектурно не гарантируется.

Поскольку широкий диапазон событий сериализации очистит буферы объединения записи, вполне возможно, что операция / событие очистки присутствует, но не очевидна (как SFENCE). Из Руководства разработчика программного обеспечения Intel® 64 и IA-32 для архитектуры (версия 052, сентябрь 2014 г.), том 3, раздел 11.3 Доступные методы кэширования:

Если буфер WC частично заполнен, запись может быть отложена до следующего события сериализации; такие как инструкция SFENCE или MFENCE, выполнение CPUID, чтение или запись в не кэшированную память, возникновение прерывания или выполнение инструкции LOCK.

Например, запись в регистр графического процессора (если он сопоставлен с не кэшированной памятью) будет очищать буфер объединения записи.

Другие вопросы по тегам