Определение количества циклов кода операции для CPU - PullRequest
3 голосов
/ 24 февраля 2010

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

http://www.obelisk.demon.co.uk/6502/reference.html

Если вы изучите исходный код MAME, особенно в разделе src \ emu \ cpu, вы увидите, что большинство моделей процессоров отслеживают количество циклов аналогичным образом. У меня вопрос: где можно получить эту информацию или проанализировать ее, если она недоступна? Я никогда не видел ни одного «официального» руководства программиста ASM, содержащего информацию о количестве циклов. Мое первоначальное предположение состоит в том, что небольшая программа добавляется в bootrom реального оборудования, и, если она содержит код операции, эквивалентный RDTSC, выполняется нечто вроде этого:

RDTSC

//opcode of choosing

RDTSC

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

Ответы [ 2 ]

3 голосов
/ 24 февраля 2010

С точки зрения Pentium, число процессоров было легко найти для процессоров Intel и AMD (и большинства конкурентов). Однако, начиная с Pentium Pro и AMD K5, центральный процессор перешел на динамическую модель исполнения, в которой инструкции могут выполняться не по порядку. В этом случае время, затрачиваемое на выполнение инструкции, в значительной степени зависит от данных, которые она использует, и от того, зависит ли (например) от данных из предыдущей инструкции (в этом случае она должна ждать завершения этой инструкции, прежде чем она сможет это сделать). выполнение).

Существуют также ограничения на такие вещи, как то, сколько инструкций может быть декодировано за цикл (например, по крайней мере одна, плюс еще две, если они «простые») и сколько может быть удалено за цикл (обычно около трех или четыре).

В результате на современном процессоре практически бессмысленно говорить о циклах для данной инструкции изолированно. Значимые результаты требуют потока инструкций, так что вы смотрите не только на эту инструкцию, но и на то, что происходит до и после нее. Инструкция, которая является серьезным узким местом в одном потоке команд, может быть по существу свободной в другом потоке (например, если у вас есть одно умножение, смешанное с большим количеством добавлений, умножение может быть почти бесплатным - но если оно окружено множеством других умножений , это может быть относительно дорого).

1 голос
/ 24 февраля 2010

Принятый счетчик RDTSC должен иметь инструкцию сериализации, чтобы все предыдущие инструкции были удалены до получения счетчика. Это увеличивает накладные расходы на счет, но вы можете просто «посчитать» нулевые инструкции и вычесть это значение из измеренных инструкций.

Некоторые руководства в формате pdf, которые очень хорошо освещают это.

http://www.agner.org/optimize/#manuals

...