читаю у Юрова описалово subj и не могу въехать, зачем они нужны. Может, кто поможет ? На конкретном примере.
Вот пример кода, где используется sfence. Нужна эта команда для выгрузки данных из буфера записи в память при "хитрой" работе с кэшем, как в примере по ссылке.
Статья полезная. Однако еще больше запутала. Читаем Юрова - "гарантированная запись информации из кэш-памяти всех уровней. Команда сохраняет данные из кэш памяти по соотв. адресам оперативной памяти. Выполняется сериализация (сохранение в долговременную память) всех операций записи в память, инициированных перед выдачей команды sfence." В статье же сказано, "заметим, что sfence необходима после того, как данные записаны ,для очистки буфера записи". IMHO это разные по сути трактовки. Или следует понимать "для сброса данных из кэша в ОЗУ и очистки буфера записи"? А про LFENCE & MFENCE там ни слова.;( Охота уже активно юзать SSE & SSE2. А получается, что без полного понимания того, как работает к.-л. инструкция,пользоваться ими иногда и опасно. Если, к примеру, процедурка обслуживания аппаратного прерывания сделает тот же самый sfence где-нить в середине указанного оптимизирующего цикла, то все ухищрения из этой статьи - коту под хвост, isn't it? PS Может я не понял чего, просьба сильно матом не ругать
При всём уважении к Юрову - вряд ли он написал больше про эти команды, чем просто перевод описания из 2го тома Интела. Скорее всего, твоя "обобщённая" формулировка и есть правильная только вместо "очистки буфера записи" наверное лучше будет "сохранение его содержимого в памяти". Я как-то делал что-то командами movntq, и если в конце не было sfence, то часть данных просто пропадала (?) не сохраняясь. Статью я ту к чему привёл - как я понимаю, команды эти в отдельности имеют мало смысла и служат вспомогательными при играх с конвеером и кэшем. Ещё можно почитать раздел "Optimizing Cache Usage" из IA-32 Intel® Architecture Optimization Reference Manual, что бы ещё больше запутаться
При некешируемых записях типа movntq и т.п. данные не пишутся сразу в ОЗУ, а накапливаются в write-combining (WC) буферах.(В PIII и P4 имеется 4 доступных для записи WC буфера, каждый размером = пакету записи в ОЗУ, в PIII 32 байта, в P4 64 байта). Команды SFENCE\MFENCE (а также CPUID) форсируют запись этих буферов в ОЗУ. Если не выгрузить эти буферы принудительно, то данные будут сидеть в процессоре неопределенное время, пока не случится прерывание, переключение задачи и т.п. или пока не потребуется освободить буфер(ы) для других операций записи (как некешируемых, так и кешируемых при отсутствии соответсвующей линейки в L2)