Нужно ли программировать сбрасывать записи памяти в явном виде?
Я знаю, что записи в комбинат записываются в кеш и не достигают памяти напрямую. Но нужно ли программисту явно очистить эту память, прежде чем другие смогут получить к ней доступ?
Я получил этот вопрос из кода графического драйвера. Например, 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.
Например, запись в регистр графического процессора (если он сопоставлен с не кэшированной памятью) будет очищать буфер объединения записи.