Если ЦП всегда выполняет инструкции, как мы можем измерить его работу?

Допустим, у нас есть фиктивный одноядерный ЦП с программным счетчиком и базовым набором инструкций, таких как загрузка, сохранение, сравнение, переход, добавление, Mul, а также некоторое ПЗУ и ОЗУ. При включении запускает программу из ПЗУ.

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

Однако со стороны, если тактовая частота остается постоянной, можно с уверенностью сказать, что процессор постоянно работает на 100%.

Как именно установить парадигму для измерения работы процессора? Есть ли какая-то стандартная метрика, основанная, возможно, на типе выполняемых инструкций, энергопотреблении ЦП, количестве тактовых циклов, которые необходимо завершить, или даже на том, обращается ли он к ОЗУ или ПЗУ.

Второй связанный с этим вопрос: что означает «остановка» программы. Обычно он просто разветвляется в бесконечном цикле или ПК останавливается, а ЦП ожидает прерывания?


person Andy Fusniak    schedule 05.03.2015    source источник


Ответы (3)


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

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

Итак, хотя в старые времена DOS, когда компьютер выполнял (почти) только одну задачу, было правдой, что он всегда что-то делал. Многие приложения использовали так называемое ожидание занятости, если они просто задерживали свое выполнение на некоторое время, не делая ничего полезного. Но сегодня почти всегда будет умная ОС, которая может запускать процесс ожидания, а не переводить процессор в спящий режим, снижать его скорость и т. Д.

person Michał Kosmulski    schedule 05.03.2015
comment
Процессор также может зависнуть в ожидании памяти (или даже инструкции с высокой задержкой). Бесполезная работа также возможна с предсказанием ветвления (ошибочного) (предсказание того, что инструкция не вызовет исключения, эквивалентно предсказанию ветвления). - person Paul A. Clayton; 05.03.2015

О, мальчик, это крутой парень. Это очень практический вопрос, поскольку это показатель производительности и эффективности, а также очень субъективный вопрос, поскольку он определяет, какие инструкции более или менее «полезны» для достижения цели приложения. Целью приложения может быть что угодно, например, поиск решения сложного матричного уравнения или рендеринг изображения на дисплее.

Кроме того, современные процессоры выполняют такие функции, как синхронизация в режиме ожидания. Генератор по-прежнему производит циклы, но никакие инструкции не выполняются из-за того, что определенные схемы простаивают из-за того, что циклы их не достигают. Это циклы, которые не делают ничего полезного, и их нужно игнорировать.

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

Таким образом, мы должны подсчитывать только те инструкции, которые завершены (т. Е. Отменены), и циклы, которые фактически используются для выполнения инструкций (т. Е. Необработанные).

Возможно, наиболее практичным общим показателем «работы» является CPI или количество циклов на инструкцию: CPI = CPU_CLK_UNHALTED.CORE / INST_RETIRED.ANY. CPU_CLK_UNHALTED.CORE - это циклы, используемые для выполнения фактических инструкций (по сравнению с «потраченными впустую» в состоянии ожидания). INST_RETIRED - это те инструкции, которые выполняются (по сравнению с теми, которые не выполняются из-за чего-то вроде неверного прогноза ветки).

Попытка получить более конкретную метрику, такую ​​как инструкции, которые вносят вклад в решение множественной матрицы, и исключение инструкций, которые не вносят прямого вклада в вычисление решения, таких как инструкции управления, очень субъективны, и по ним сложно собрать статистику. . (Есть некоторые, что вы можете, например VECTOR_INTENSITY = VPU_ELEMENTS_ACTIVE / VPU_INSTRUCTIONS_EXECUTED, который представляет собой количество векторных операций SIMD, таких как SSE или AVX, которые выполняются в секунду. Эти инструкции с большей вероятностью будут напрямую способствовать решению математической решение, поскольку это их основная цель.)

Теперь, когда я вас отговорил, ознакомьтесь с некоторыми ресурсами по оптимизации на вашем местном ресурсе для разработчиков Intel, software.intel.com. В частности, узнайте, как эффективно использовать VTune. Я не предлагаю вам получить VTune, хотя вы можете получить студенческую лицензию бесплатно или со скидкой (я думаю). Но материал многое расскажет вам об увеличении производительности ваших программ (то есть об оптимизации), что, если вы задумаетесь, увеличивает полезную работу, которую выполняет ваша программа.

person Taylor Kidd    schedule 06.03.2015

Немного расширяя ответ Михала:

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

Затем ОС может отслеживать, как долго каждый процесс фактически выполняется (запоминая время начала и окончания каждого запуска), и генерировать статистику, такую ​​как время ЦП и загрузка (длина очереди готовых процессов).

И чтобы ответить на ваш второй вопрос:

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

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

person billc.cn    schedule 05.03.2015