Время выполнения инструкции EMMS? - PullRequest
2 голосов
/ 26 марта 2009

Я читаю Искусство сборки: набор инструкций MMX ". После выполнения некоторых инструкций MMX необходимо выполнить инструкцию EMMS для сброса FPU. В нем говорится, что инструкция EMMS довольно медленно.

Однако, когда я профилировал время выполнения EMMS, чтобы увидеть, насколько медленно это было (при использовании RDTSC для подсчета тактов), оно, похоже, выполняется за 0 циклов.

Что происходит? Я где-то ошибся или Art Of Assembly устарела?

Ответы [ 2 ]

2 голосов
/ 01 июля 2009

Это было медленно на древнем Pentium MMX, но на более современных процессорах это очень быстро.

Тем не менее, MMX сегодня в основном устарел. Используйте SSE2, и у вас не возникнет проблем с мультиплексированием с FPU.

Кроме того, инструкция RDTSC может выполняться параллельно с другими инструкциями, что объясняет ваши измерения - ЦП просто начал выполнять RDTSC и EMMS одновременно в одном такте ... Если вы хотите измерить время на фрагмент кода занимает, вы должны сериализовать оба RDTSC относительно кода - обычно для этого используется инструкция CPUID. Поскольку инструкции по сериализации, которые вы используете, сами берут циклы ЦП, вы должны также измерить, сколько циклов требуется без кода между записываемой вами измерительной установкой.

Последний момент: даже на Pentium MMX сама инструкция EMMS заканчивалась быстро - это была первая инструкция FPU после этого, которая получала неприятную задержку ...

0 голосов
/ 01 июля 2009

Вам нужна команда сериализации, такая как CPUID, чтобы убедиться, что RDTSC не выполняется не по порядку. Вы можете прочитать больше здесь .

...