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

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

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


person zhebin jin    schedule 23.09.2014    source источник


Ответы (1)


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

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

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

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

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

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

person Paul A. Clayton    schedule 23.09.2014
comment
Очень подробный ответ. Меня это давно смущает. Теперь понятно. Большое спасибо! - person zhebin jin; 25.09.2014