Вычисление среднего числа циклов для каждой команды с учетом времени выполнения, количества команд и тактовой частоты - PullRequest
0 голосов
/ 11 февраля 2020

Итак, я изучаю компьютерную архитектуру, где мы должны учитывать разные процессоры и их часы, и я не могу не чувствовать, что мои вычисления отключены при расчете среднего ИПЦ. Для одного такого процесса мне дают:

  • Количество команд 1.0E9
  • Время выполнения 1,5 с для программы компилятора A
  • и тактовую частоту 8.0E9 Гц для процессора.

Мое переработанное уравнение: CPI = (Execution Time * Clock Rate)/Instruction Count.

Подставляя значения, я получил, что средний ИПЦ для программы Компилятора А равен 12. Однако это намного выше, чем для других. практические проблемы. Мне было интересно, если мои расчеты были правильными или нет, и если так, то почему CPI так высок?

1 Ответ

1 голос
/ 11 февраля 2020

Если бы это был реальный, а не вымышленный случайный пример:

Я бы ожидал, что процессор 8 ГГц будет сильно конвейеризованным, и, таким образом, будет иметь высокие штрафы за ошибочные прогнозы ветвлений и другие задержки. , И, возможно, более высокая задержка для более сложных инструкций. (Предположительно все еще задержка одного цикла для add и других простых инструкций ALU; тактирование настолько велико, что вы не можете сделать это, имеет смысл, только если вы хотите 8 ГГц для маркетинга, а не для реальной производительности.)

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

См. Также Современные микропроцессоры A 90-минутный гид! - это был бы полный дизайн "демона скорости", противоположный "brainia c".


Но даже тогда, ИПЦ 12, вероятно, не будет будьте типичны (например, для SPECint2017) для любого вменяемого дизайна, который кто-то потрудится построить. Но помните, это для одной конкретной c программы. Очень высокий CPI (низкий IP C) также является признаком неэффективного программного обеспечения (или, по крайней мере, выполнения чего-то, что неизбежно замедляется), например, тратит много времени на просмотр связанных списков, которые отсутствуют в кеше. Адрес для следующей загрузки зависит от предыдущей загрузки, поэтому он не может даже запуститься, пока не поступит из какого-либо внешнего кэша или даже из памяти.

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


Или, конечно, поскольку это только теоретический пример без ущерба для здравомыслия, Процессор может быть настолько тупо неэффективным, насколько мы хотим: возможно, он микрокодирован (и не конвейерен), как оригинальный 8086 и другие микропроцессоры той эпохи, и выполняет инструкции, выполняя шаги микрокодирования, каждый из которых занимает тактовый цикл. (Например, детали производительности Z80 были известны с точки зрения внутренних состояний по сравнению с тактовыми циклами, а обычные инструкции занимали несколько раз.) одна инструкция (с парой входных указателей) может заменить целый l oop на массивы чисел с плавающей точкой. (Таким образом, высокопроизводительные ЦП могут использовать преимущества более широких каналов передачи данных, не требуя другого машинного кода, как мы делаем для современного SIMD с коротким вектором, такого как x86 SSE / AVX / AVX512, чтобы использовать преимущества нового HW с более широкими модулями SIMD add / mul / FMA .)

...