Как можно программно моделировать более низкие частоты процессора? - PullRequest
7 голосов
/ 02 мая 2011

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

Ответы [ 6 ]

2 голосов
/ 03 мая 2011

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

2 голосов
/ 02 мая 2011

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

2 голосов
/ 02 мая 2011

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

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


Edit :

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

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

1 голос
/ 04 мая 2011

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

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

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

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

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

1 голос
/ 04 мая 2011

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

0 голосов
/ 03 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...