2011-05-02 4 views
7

Я заинтересован в запуске программы на определенной частоте (например, 25 МГц) на моем процессоре с частотой 2 ГГц. Единственный метод, который я могу придумать для того, чтобы сделать что-то вроде этого, - это использовать функцию спящего режима с точностью до микросекунды, но я не уверен, как рассчитать, как долго поток должен спать для того, чтобы соответствовать определенной частоте. Любые советы или другие идеи? Я делаю это в C на ОС X86 Linux.Как программно имитировать более низкие частоты процессора?

+0

Какова ваша цель/«прецедент» для этого? Вы пытаетесь измерить производительность на более низких скоростях? – jwmacdon

+0

Я создал виртуальный процессор, и я хочу запустить его на определенной частоте. – ytrp

ответ

2

Здесь есть пара проблем. Это первое, что вы пытаетесь имитировать. Современные процессоры работают с тактовой частотой 2 ГГц, но с инструкциями по конвейеру, поэтому индивидуальная инструкция может занять 10-30 часов. Помещая спать в потоке, вы разбиваете трубопровод. Во-вторых, насколько вы хотите, чтобы вы симулировали. Вам нужно иметь время на уровне инструкций, можем ли мы подделать его, поставив некоторое пространство между функциями.

Моя последняя мысль состоит в том, что вы, скорее всего, не хотите имитировать современный процессор, работающий на частоте 25 МГц, но некоторый тип ARM-чипа на встроенном устройстве. Если это так, то для большинства этих чипов уже есть очень хорошие симуляторы. Скомпилируйте свой код в собственные инструкции для целевого чипа, они используют уже доступный симулятор, если он доступен.


Edit:

Так как я теперь понимаю вы хотите выполнить команду на виртуальной раз процессор 25M в секунду. Я мог бы попробовать адаптивный подход. У вас есть много времени, чтобы «возиться» между инструкциями. начните с размещения некоторого интервала, сон, вероятно, будет работать между каждой инструкцией. Обратите внимание, что в массиве с максимальной точностью, когда все виртуальные часы начинают поддерживать скользящее среднее, например, последние 25, 100 или 1000 циклов. Если среднее значение возрастает выше 25 МГц, добавьте больше места. Если это слишком медленно, уменьшите пространство.

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

+1

Такой ответ не помогает. Автор спросил, как, а не где покупать уже существующее программное обеспечение. – subwar

+1

Subwar, когда я написал этот ответ, комментарий «Я сделал виртуальный процессор ...» не был опубликован. Я ответил на вопрос, который, как я думал, спросили, как имитировать запуск 2Ghz X86-процессора с частотой 25 МГц. Второй параграф предполагал, что это не совсем то, что он хотел сделать. Оказывается, я был прав. Он действительно хотел моделировать другой процессор, просто не существовавший ранее. –

+0

Я прыгнул с пистолета. Извините друга :) – subwar

1

Я предложил бы архитектуру, управляемую событиями: на каждом шаге (1/hz) срабатывает команда 1 инструкции.

2

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

0

См. Эмулятор CPU Fracas для подхода к этому. Авторы рассказали об этом на мастерской Heteropar, часть EUROPAR 2010. Они существенно изменяют планировщик ОС, чтобы разрешить использование только фракций реальной частоты процессора, которые будут использоваться пользовательскими программами.

1

Чтобы подвести итог сказанным выше, если вы находитесь в пользовательском режиме, пытаясь эмулировать виртуальный процессор с определенной частотой, вы должны реализовать какое-то ручное «планирование» потока, обрабатывающего инструкции CPU, либо через вызовы сна или более сложные функции и функции, такие как волокна в Windows. Осторожность, которую вы должны обратить внимание, заключается в том, что некоторые вызовы сна в режиме сна не спят за точное количество времени, которое вы указали, поэтому вам может потребоваться добавить дополнительный код для калибровки отклонения от компьютера к компьютеру, чтобы приблизиться к целевой частоте , Чаще всего вы не сможете точно планировать, чтобы ваш виртуальный процессор работал на устойчивой 25 МГц (вероятнее 22-28 МГц).В любом случае, я согласен с Нафаном и всплеской идеей. Удачи в том, что когда-либо путь вы используете!

+0

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

1

Для виртуальной машины все виртуально, включая время. Например, в течение 123 реальных секунд вы можете эмулировать 5432 виртуальных секунды обработки. Общим способом измерения виртуального времени является приращение (или добавление чего-либо) счетчика «количество циклов» каждый раз, когда эмулируется виртуальная команда.

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

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

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

Шаг за шагом использует буферизацию для развязки, когда что-то происходит внутри эмулятора, когда они видны внешнему наблюдателю. Для (преувеличенного) примера, представьте, что эмулированная машина думает, что это 8:23 утра, и она хочет отправить сетевой пакет, но на самом деле это только 8:00 утра. Простое решение - отложить эмуляцию в течение 23 минут, а затем отправить пакет. Это звучит неплохо, но если (после того, как виртуальная машина отправляет пакет), эмулятор борется за то, чтобы не отставать от реального времени (из-за других процессов, запущенных на реальном компьютере или по любой другой причине) эмулятор может отстать, и у вас могут быть проблемы с сохранением иллюзия, что виртуальное время такое же, как в реальном времени. В качестве альтернативы вы можете притворяться, что пакет был отправлен, и поместить пакет в буфер и продолжить эмуляцию других вещей, а затем отправить пакет позже (когда на самом деле это 8:23 утра в реальном мире). В этом случае, если (после того, как виртуальная машина отправляет пакет), эмулятор борется за то, чтобы идти в ногу с реальным временем, у вас все еще есть 23 минуты свободы.

Смежные вопросы