Предыдущая страница (целочисленные SIMD-команды)

С помощью этих команд можно в 4 раза ускорить такие операции, как копирование одной области памяти большого объёма в другую. Например, я использовал это для очищения буфера экрана (области, где строится изображение) в компьютерной графике. В этом случае берётся регистр MMX (или SSE), обнуляются все его биты (чтобы закрасить чёрным), затем этим регистром постепенно обнуляется вся область пямяти, а это, например, для режима 640x480x16 (65536 цветов) составляет около 600 килобайт. Так как за одну секунду нужно много раз очищать экран (столько раз, какова частота кадров, поэтому не менее 30), то выигрыш получается значительный. Особенно большой выигрыш (в 4 раза) получается для больших кусков памяти, превосходящих по объёму кэш-память компьютера. Например, у моего компьютера кэш-память 512 Кб, и уже на 1 мегабайте получается четверной выигрыш. Суть в том, что эти команды передают данные в память, но не ждут, пока ими можно будет воспользоваться. ТО есть если мы пересылаем что-либо в память с помощью какой-нибудь команды (например, movntq), то при прочтении этих данных из памяти СРАЗУ после выполнения записи не факт, что прочитанное будет совпадать с записанным. Читать можно только после выполнения команды sfence, которая гарантирует, что все операции записи в память, расположенные в тексте программы до неё будут выполнены раньше, чем процессор начнёт выполнять операции, помещённые в тексте программы позднее. Можно обойтись и без sfence, если вы уверены, что записанные в память данные ещё не скоро потребуются (пройдёт не менее 1000 тактов до того, как они потребуются). Но в этом случае нужно быть уверенным, что в течение времени ожидания не только нельзя читать из этих ячеек памяти, но и писать нельзя в эти ячейки памяти. Объясним, почему: вы, например, записываете число 100, затем 200. Число 100 ещё не дошло до адресата (ячейки памяти), как не дошло и число 200. Может получиться, что 200 придёт раньше, чем 100, то есть будут записаны неверные данные

Команды управления кэшированием


1) maskmovq источник, маска – запись байтов минуя кэш. Данные из источника (rMMX) записываются в память по адресу edi. edi не продвигается! При этом старший бит каждого байта в маске (rMMX) определяет, записывается ли соответствующий байт источника в память или нет. То есть бит 7 маски разрешает запись нулевого байта (битов 7—0) источника, и т. д. Если байт не записывается, то соответствующий байт в памяти обнуляется

2) movntq приёмник, источник – запись 64 бит минуя кэш. Содержимое источника (rMMX) записывается в приёмник (m64), сводя к минимуму загрязнение кэша

3) movntps приёмник, источник – запись 128 бит минуя кэш. Содержимое источника (rSSE) записывается в приёмник (m128), сводя к минимуму загрязнение кэша

4) sfence – защита записи. Современные процессоры при работе с памятью могут выполнять обращения к ней не в том порядке, в каком они указаны в программе. Команда sfence гарантирует, что все операции записи в память, расположенные в тексте программы до неё будут выполнены раньше, чем процессор начнёт выполнять операции, помещённые в тексте программы позднее