Есть ли ситуация, когда состояние конвейера процессора (с уже декодированными или запрограммированными инструкциями) сохраняется и впоследствии перезагружается после возобновления во время спящего потока/контекстного переключения/прерывания и т. Д.? (Может быть как оптимизация).Сохранение состояния конвейера процессора
ответ
Это невозможно для любого процессора, о котором я знаю. Там нет интерфейса для этого, и нет условий, при которых процессор делает это самостоятельно. Сброс огромного количества внутреннего состояния процессора в ОЗУ займет больше циклов, чем он будет экономить. Если ОС отслеживает требуемые для этого требуемые объемы памяти, это просто ухудшит накладные расходы.
Если что-то стоило сэкономить, BTW, это были бы результаты уже выполненной инструкции, которая еще не может уйти из-за нагрузки, пропущенной в кеше. (Все общие схемы исполнения вне очереди для основных МСА используют для выхода из строя в порядке выхода из строя для поддержки точных исключений. Предлагается выход на пенсию из-за порядка с контрольной точкой/откатом от исключений и ошибочных прогнозов. Поисковый процессор обработки килограммов, IIRC.)
(испорчено идея): агрессивный испорченный дизайн может не тратить слишком много работы на переключения контекста, откладывая запись в прерывания обратного адреса при поступлении внешнего прерывания. то есть они могут притворяться, что прерывание поступило позже, чем это было сделано, разрешив выполнение некоторых инструкций, которые уже выполнены, продолжать выполнение. Если указатель инструкции пользовательского пространства не нужен до тех пор, пока обработчик прерывания не вернется, ЦП может очистить конвейер.
Hrm, это имеет большую сложность, когда регистровые значения при входе в обработчик прерываний также зависят от архитектурного состояния, поэтому это, вероятно, не сработает.
Это def. не может работать для прерываний, генерируемых пользовательским пространством, поскольку это исправляет обратный адрес.
Это не проблема для потоков, которые заставляют себя спать, ожидая на спин-блокировке monitor/mwait
или что-то в этом роде. mwait
предположительно не вступает в силу до тех пор, пока он не уйдет в отставку, и он не уйдет в отставку, пока не будет выполнена вся предыдущая работа. Это может привести к тому, что процессор будет агрессивен в отношении спекулятивного выполнения прошлого mwait
, я думаю. Или, может быть, mwait
даже не смывает трубопровод и просто экономит электроэнергию.
Я собираюсь принять это как правильный ответ, так как вы делаете хороший пример, потому что это не так в общем случае. – chamibuddhika
@chamibuddhika: Если вы знаете какой-либо конкретный случай, когда что-то подобное делается, я хотел бы услышать об этом. AFAIK, любая оптимизация для минимизации отбрасывания полезных данных полностью выполняется внутри ЦП без управления программным обеспечением или видимого архитектурного состояния. В одном случае я могу думать о том, где что-то подобное делается, так как кэши данных помечены тегом VM, поэтому переключение между гипервизором и гостями (-ами) не должно приводить к аннулированию кешей. Фактически, это может включать в себя программное обеспечение, обнаруживающее эту функцию, и не выполняющее команду кэша-недействительности. google подробнее ... –
Нет, на самом деле я этого не знаю. – chamibuddhika
Идея была предложена, но вам понадобится гораздо более плотная технология памяти, которая только теперь становится доступной. Смотрите эту бумагу, например:
http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=6489970
В основном, они предлагают трубы, состоящие из нового набора защелок & регистров на основе мемристоров (резистивных нелетучих компонентов памяти), которые могут содержать несколько значений, соответствующих нескольким потокам , Логика управления может затем сообщить всем защелкам, что поток должен быть активным, и разрешить одновременное переключение контекста по всей трубе.
Имейте в виду, что это только повышает степень детализации на уровне защелки. Современные процессоры с одновременной многопотоковой обработкой уже могут иметь разные потоки, активные на разных уровнях устройств без контекстных переключателей, простые через арбитраж. Другие единицы с присущим параллелизмом могут уже обрабатывать несколько потоков за цикл (например, многопотоковые ALU)
- 1. Сохранение конвейера выполнения
- 2. Сохранение частей конвейера sklearn
- 3. Выполняет ли VMCALL-инструкцию в x86 сохранение состояния гостевого процессора
- 4. Сохранение состояния состояния iphone sdk
- 5. Какие шаги необходимы для конвейера процессора в VHDL?
- 6. Управление потоками Java в симуляторе конвейера команд процессора
- 7. Каким образом кеш может повысить производительность процессора конвейера?
- 8. Сохранение состояния `видимости EditText`
- 9. Сохранение состояния при вращении
- 10. Сохранение состояния активности/фрагмента
- 11. Сохранение состояния CheckedTextView
- 12. Сохранение состояния фрагментов?
- 13. Сохранение состояния на Java
- 14. Сохранение состояния фрагмента
- 15. сохранение состояния переключения
- 16. Сохранение состояния с Android
- 17. Сохранение состояния зарегистрированных пользователей
- 18. Сохранение состояния игры Android
- 19. Сохранение целого состояния активности
- 20. Сохранение состояния сетки Kendo
- 21. Сохранение состояния приложения
- 22. Сохранение состояния пользовательского RecyclerView
- 23. Сохранение состояния приложения
- 24. Сохранение состояния программы
- 25. Сохранение состояния фрагмента backstack
- 26. сохранение состояния UITableviewcell accessoriesView
- 27. Сохранение состояния флажка
- 28. Сохранение состояния магазина
- 29. Сохранение состояния и MVVM
- 30. Сохранение состояния страницы mvc4
Готовы ли вы подсчитать программные преобразования микросхем VLIW, такие как Transmeta/Denver, которые (в первом приближении) в значительной степени _work_, что путь? : P – Notlikethat
Это было полезно знать :). Но в основном я фокусировался на архитектуре x86_64 и ARM. – chamibuddhika
Конструкция crusoe Transmeta * является * процессором x86. Внутри он реализован JIT-компилятором машинного кода x86 для машинного кода VLIW и кэширования. Таким образом, он находит параллелизм один раз и не должен делать это на лету каждый раз, когда архитектурное состояние x86 проходит по одному и тому же коду. Это то, что @Notlikethat получал. –